2024年3月26日发(作者:)

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位的位图文件,因此它是含有调色板的。

在拉出图像数据进行分析之前,我们首先进行几个约定:

1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据

的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。如数据

0x1756在内存中的存储顺序为:

这种存储方式称为小端方式(little endian) , 与之相反的是大端方式(big

endian)。对两者的使用情况有兴趣的可以深究一下,其中还是有学问的。

2. 以下所有分析均以字节为序号单位进行。

下面我们对从文件中拉出来的数据进行剖析:

一、 bmp文件头