将BMP文件以16进制形式打开可看见如下内容:
OFFSET | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |
|
00000000 00000010 00000020 00000030 00000040 * * * * * 00038420 00038430 | 42 4D 36 84 03 00 00 00 00 00 36 00 00 00 28 00 00 00 40 01 00 00 F0 00 00 00 01 00 18 00 00 00 00 00 00 84 03 00 D7 0D 00 00 D7 0D 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |
|
依照下表的格式分析BMP文件的数据,可知上表中数据的意义:
位置 | 名称 | 大小 (Bytes) | 值 | 含义 |
0x00000000 | 文件标识 | 2 | 0x42 0x4D (BM) | 两字节的内容用来识别位图的类型: BM : Windows 3.1x, 95, … BA :OS/2 Bitmap Array CI:OS/2 Color Icon CP :OS/2 Color Pointer IC: OS/2 Icon PT :OS/2 Pointer 注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识BM就行。 |
0x00000002 | File Size | 4 | 0x00038436 | 用字节表示的整个文件的大小(小端格式) |
0x00000006 | Reserved | 4 | 0x00000000 | 保留,必须设置为0 |
0x0000000A | Bitmap Data Offset | 4 | 0x00000036 | 文件开始到位图数据的偏移 (0x00000000~0x00000036) |
0x0000000E | Bitmap Header Size | 4 | 0x00000028 | 位图信息头的长度,用来描述位图的颜色、压缩方法等。下面的长度表示: 0x28 – Windows 3.1.x,95,NT ,… 0x0C – OS/2 1.x 0x0F – OS/2 2.x 注:在windows95、98、2000等操作系统中,位图信息头的长度并不一定是0x28,因为微软已经制定出了新的BMP文件格式。其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数0x28,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。 |
0x00000012 | Width | 4 | 0x00000140 | 位图的宽度,以像素为单位 |
0x00000016 | Height | 4 | 0x000000F0 | 位图的高度,以像素为单位 |
0x0000001A | Planes | 2 | 0x0001 | 位图的位面数(注:该值总是1) |
0x0000001C | Bits Per Pixel | 2 | 0x0018 | 每个像素的位数 1 – 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色) 4 – 16色位图 8 – 256色位图 16 – 16bit高彩色位图 24 – 24bit真彩色位图 32 – 32bit增强型真彩色位图 |
0x0000001E | Compression | 4 | 0x00000000 | 压缩说明: 0 – 不压缩(使用BI_RGB表示) 1 – RLE 8 使用8位RLE压缩方式(使用BI_RGB8表示) 2 - RLE 4 使用4位RLE压缩方式(使用BI_RGB4表示) 3 – Bitfields 位域存放方式(用BI_BITFIELDS表示) |
0x00000022 | Bitmap Data Size | 4 | 0x00038400 | 用字节数表示的位图数据的大小。该数必须是4的倍数 |
0x00000026 | HResolution | 4 | 0x00000DD7 | 用像素/米表示的水平fenbianlv |
0x0000002A | VResolution | 4 | 0x00000DD7 | 用像素/米表示的垂直fenbianlv |
0x0000002E | Colors | 4 | 0x00000000 | 位图使用的颜色数 |
0x00000032 | Important Colors | 4 | 0x00000000 | 制定重要的颜色数。当该值等于颜色数时(或者等于0时),表示所有颜色都一样重要 |
根据BMP版本的不同而不同 | Palette | N*4bytes |
| 调色板规范。对于调色板中的每个表项,这4个字节用下述方法描述RGB的值: 1字节用于蓝色分量 1字节用于绿色分量 1字节用于红色分量 1字节用于填充符(设置为0) |
根据BMP版本及调色板尺寸的不同而不同 | Bitmap Data | xxx bytes |
| 该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。 |