欢迎来到天天文库
浏览记录
ID:50178463
大小:172.00 KB
页数:12页
时间:2020-03-06
《bmp文件格式详解.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、窗体顶端BMP文件格式,又称为Bitmap(位图)或是DIB(Device-IndependentDevice,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphicaluserinterfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。BMP文件的
2、数据按照从文件头开始的先后顺序分为四个部分:Ø bmp文件头(bmpfileheader):提供文件的格式、大小等信息Ø 位图信息头(bitmapinformation):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息Ø 调色板(colorpalette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表Ø 位图数据(bitmapdata):就是图像数据啦^_^下面结合Windows结构体的定义,通过一个表来分析这四个部分。我们一
3、般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据段的排布以及组成。我们使用的图像显示如下: 这是一幅16位的位
4、图文件,因此它是含有调色板的。在拉出图像数据进行分析之前,我们首先进行几个约定:1.在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。如数据0x1756在内存中的存储顺序为:这种存储方式称为小端方式(littleendian),与之相反的是大端方式(bigendian)。对两者的使用情况有兴趣的可以深究一下,其中还是有学问的。2.以下所有分析均以字节为序号单位进行。下面我们对从文件中拉出来的数据进行剖析: 一、bmp文件头W
5、indows为bmp文件头定义了如下结构体:typedefstruct tagBITMAPFILEHEADER{ UINT16bfType; DWORDbfSize;UINT16bfReserved1;UINT16bfReserved2;DWORDbfOffBits;}BITMAPFILEHEADER; 其中: 对照文件数据我们看到:1-2:424dh='BM',表示这是Windows支持的位图格式。有很多声称开头两个字节必须为'BM'才是位图文件,从上表来看应为开头两个字节必须为'BM'才是W
6、indows位图文件。3-5:00010436h=66614B=65.05kB,通过查询文件属性发现一致。6-9:这是两个保留段,为0。A-D:00000436h=1078。即从文件头到位图数据需偏移1078字节。我们稍后将验证这个数据。共有14个字节。二、位图信息头同样地,Windows为位图信息头定义了如下结构体: 代码typedefstruct tagBITMAPINFOHEADER {DWORDbiSize;LONGbiWidth;LONGbiHeight;WORDbiPlanes;WORD
7、biBitCount;DWORDbiCompression;DWORDbiSizeImage;LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER; 对照数据文件:0E-11:00000028h=40,这就是说我这个位图信息头的大小为40个字节。前面我们已经说过位图信息头一般有40个字节,既然是这样,为什么这里还要给一个字段来说明呢?这里涉及到一些历史,其实位图信息头原
8、本有很多大小的版本的。我们看一下下表: 出于兼容性的考虑,大多数应用使用了旧版的位图信息头来保存文件。而OS/2已经过时了,因此现在最常用的格式就仅有V3header了。因此,我们在前面说位图信息头的大小为40字节。12-15:00000100h=256,图像宽为255像素,与文件属性一致。16-19:00000100h=256,图像高为255像素,与文件属性一致。这是一个正数,说明图像数据是从图像左下角到右上角排列的。1A
此文档下载收益归作者所有