WhatIfBMPFormat

WhatIfBMPFormat

ID:40985031

大小:64.50 KB

页数:8页

时间:2019-08-12

WhatIfBMPFormat_第1页
WhatIfBMPFormat_第2页
WhatIfBMPFormat_第3页
WhatIfBMPFormat_第4页
WhatIfBMPFormat_第5页
资源描述:

《WhatIfBMPFormat》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、BMP文件结构的探索WhatIf2004-9-10一、文件格式Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。首先,整个bmp文件的内容可以分为3到4块。之所以分为3到4块而不是固定的值,是因为,对于bmp来说可能存在调色板或者一些掩码。具体稍候讨论。第一块是bmp的文件头用于描述整个bmp文件的情况。结构如下:typedefstructtagBITMAPFILEHEADER{WORDbfTyp

2、e;DWORDbfSize;WORDbfReserved1;WORDbfReserved2;DWORDbfOffBits;}BITMAPFILEHEADER,*PBITMAPFILEHEADER;这些信息相当有用,如果你想直接来解析bmp文件。第一个bfType用于表示文件类型,如果它是bmp文件,那么它这个位置的值一定是”BM”也就是0x4D42。第二个bfSize表示整个文件的字节数。第三第四个则保留,目前无意义,最后一个相当重要,表示,位图的数据信息离文件头的偏移量,以字节为单位。第二块是位图信息头,即BITMAPINFOHEADER,用于描述整个位图文件的情况。以下挑重

3、要的数据进行解释typedefstructtagBITMAPINFOHEADER{DWORDbiSize;//表示本结构的大小LONGbiWidth;//位图的宽度LONGbiHeight;//位图的高度WORDbiPlanes;//永远为1,由于没有用过所以没做研究附msdn解释//Specifiesthenumberofplanesforthetargetdevice.Thisvaluemustbesetto1.WORDbiBitCount;//位图的位数分为148162432本文没对14进行研究DWORDbiCompression;//本以为压缩类型,但是却另外有作用,稍

4、候解释DWORDbiSizeImage;//表示位图数据区域的大小以字节为单位LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER,*PBITMAPINFOHEADER;第三块就是调色板信息或者掩码部分,如果是8位位图则存放调色板;16与32位位图则存放RGB颜色的掩码,这些掩码以DWORD大小来存放。最后一块就是位图的数据实体。以上文件信息可以在任意一篇bmp文件结构的文章中找到描述,所以本文只是稍微带过。二、4字节对其问题关于数据读取。Bmp文

5、件有个重要特性,那就是对于数据区域而言,每行的数据它必须凑满4字节,如果没有满,则用冗余的数据来补齐。这个特性直接影响到我们读取位图数据的方法,因为在我们看来(x,y)的数据应该在y*width+x这样的位置上但是因为会有冗余信息那么必须将width用width+该行的冗余量来处理,而由于位图文件有不同的位数,所以这样的计算也不尽相同。下面列出计算偏移量的一般公式。首先将位图信息读入一个UCHAR的buffer中:8位:intpitch;if(width%4==0){pitch=width;}else{pitch=width+4-width%4;}index=buffer[y*

6、pitch+x];因为8位位图的数据区域存放的是调色板索引值,所以只需读取这个index16位intpitch=width+width%2;buffer[(y*pitch+x)*2]buffer[(i*pitch+j)*2+1]两个UCHAR内,存放的是(x,y)处的颜色信息24位intpitch=width%4;buffer[(y*width+x)*3+y*pitch];buffer[(y*width+x)*3+y*pitch+1];buffer[(y*width+x)*3+y*pitch+2];32位由于一个象素就是4字节所以无需补齐虽然计算比较繁琐,但是这些计算是必须的,

7、否则当你的位图每行的象素数不是4的倍数,那么y*width+x带给你的是一个扭曲的图片,当然如果你想做这样的旋转,也不错啊,至少我因为一开始没有考虑(不知道这个特性)让一个每行象素少1字节的16位图片变成了扭曲的菱形。三、有了数据分离RGB分量。由于我的测试代码用了GDI,所以我必须讲得到的某一个点的值分离成24位模式下的RGB分离,这不是一件容易的工作。位图麻烦的地方之一就是他的格式太多,所以我们还是要分格式再讨论。8位通过第二部分提到的操作我们得到了一个index,这个值的范围是0~25

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
相关文章
更多
相关标签