文档介绍:BMP 文件格式,又称为 Bitmap(位图)或是 DIB(Device-Independent Device,
设备无关位图 ),是 Windows 系统中广泛使用的图像文件格式。由于它可以不作
任何变换地保存图像像素域的数据,因此成为我们取得 RAW 数据的重要来源。
Windows 的图形用户界面( graphical user interfaces)也在它的内建图像子系统
GDI 中对 BMP 格式提供了支持。
下面以 Notepad++为分析工具,结合 Windows 的位图数据结构对 BMP 文件格
式进行一个深度的剖析。
BMP 文件的数据按照从文件头开始的先后顺序分为四个部分:
bmp 文件头 (bmp file header):提供文件的格式、大小等信息
位图信息头 (bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
调色板 (color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
位图数据 (bitmap data):就是图像数据啦 ^_^
下面结合 Windows 结构体的定义,通过一个表来分析这四个部分。
我们一般见到的图像以 24 位图像为主,即 R、G、 B 三种颜色各用 8
bit 来表示,这样的图像我们称为真彩色,这种情况下是不需要调色
板的,也就是所位图信息头后面紧跟的就是位图数据了。 因此,我们常
常见到有这样一种说法: 位图文件从文件头开始偏移 54 个字节就是位图数据了,这其实说的是 24 或 32 位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。
下面针对一幅特定的图像进行分析, 来看看在位图文件中这四个数据段的排布以及组成。
我们使用的图像显示如下:
这是一幅 16 位的位图文件,因此它是含有调色板的。
在拉出图像数据进行分析之前,我们首先进行几个约定:
在 BMP 文件中,如果一个数据需要用几个字节来表示的话,那么该数
据的存放字节顺序为 “低地址村存放低位数据, 高地址存放高位数据” 。如数据
0x1756 在内存中的存储顺序为:
这种存储方式称为小端方式 (little endian) , 与之相反的是大端方式( big
endian)。对两者的使用情况有兴趣的可以深究一下,其中还是有学问的。
以下所有分析均以字节为序号单位进行。
下面我们对从文件中拉出来的数据进行剖析:
一、 bmp 文件头
Windows 为 bmp 文件头定义了如下结构体:
typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType;
DWORD bfSize;
UINT16 bfReserved1;
UINT16 bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中:
对照文件数据我们看到:
1-2 : 424dh = 'BM',表示这是 Windows 支持的位图格式。有很多声称开头两个字节必须为 'BM'才是位图文件,从上表来看应为开头两个字节必须为'BM' 才是 Windows 位图文件。
3-5 : 00010436h = 66614 B = kB,通过查询文件属性发现一致。
6-9 :这是两个保留段,为 0。
A-D :00000436h = 1078。即从文件头到位图数据需偏移