6.1.2 文件结构
位图文件的组成
|
结构名称
|
符号
|
位图文件头(bitmap-file header) | BITMAPFILEHEADER | bmfh |
位图信息头(bitmap-information header) | BITMAPINFOHEADER | bmih |
彩色表(color table) | RGBQUAD | aColors[] |
图象数据阵列字节 | BYTE | aBitmapBits[] |
表01 位图文件结构内容摘要
偏移量
|
域的名称
|
大小
|
内容
|
|||||||||
图象文件
头
|
0000h | 文件标识 | 2 bytes | 两字节的内容用来识别位图的类型:
‘BM' : Windows 3.1x, 95, NT, ...
‘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"就行。
|
||||||||
0002h | File Size | 1 dword | 用字节表示的整个文件的大小 | |||||||||
0006h | Reserved | 1 dword | 保留,必须设置为0 | |||||||||
000Ah | Bitmap Data Offset | 1 dword | 从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 | |||||||||
000Eh | Bitmap Header Size | 1 dword | 位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
28h - Windows 3.1x, 95, NT, ...
0Ch - OS/2 1.x
F0h - OS/2 2.x
注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
|
|||||||||
0012h | Width | 1 dword | 位图的宽度,以象素为单位 | |||||||||
0016h | Height | 1 dword | 位图的高度,以象素为单位 | |||||||||
001Ah | Planes | 1 word | 位图的位面数(注:该值将总是1) | |||||||||
图象
信息
头
|
001Ch | Bits Per Pixel | 1 word | 每个象素的位数
1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
4 - 16 色位图
8 - 256 色位图
16 - 16bit 高彩色位图
24 - 24bit 真彩色位图
32 - 32bit 增强型真彩色位图
|
||||||||
001Eh | Compression | 1 dword | 压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
|
|||||||||
0022h | Bitmap Data Size | 1 dword | 用字节数表示的位图数据的大小。该数必须是4的倍数 | |||||||||
0026h | HResolution | 1 dword | 用象素/米表示的水平分辨率 | |||||||||
002Ah | VResolution | 1 dword | 用象素/米表示的垂直分辨率 | |||||||||
002Eh | Colors | 1 dword | 位图使用的颜色数。如8-比特/象素表示为100h或者 256. | |||||||||
0032h | Important Colors | 1 dword | 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要 | |||||||||
调色板数据 | 根据BMP版本的不同而不同 | Palette | N * 4 byte | 调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:
|
||||||||
图象数据 | 根据BMP版本及调色板尺寸的不同而不同 | Bitmap Data | xxx bytes | 该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。 |
构件详解
UINT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
|
|
|
|
|
|
|
|
|
|
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
|
|
|
|
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
|
|
||||||||
|
|
||||||||
|
|
||||||||
|
|
||||||||
|
|
||||||||
|
说明图象数据压缩的类型。其值可以是下述值之一:
|
||||||||
|
说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0 | ||||||||
|
说明水平分辨率,用象素/米表示 | ||||||||
|
说明垂直分辨率,用象素/米表示 | ||||||||
|
说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项) | ||||||||
|
|
第二个字节的值为0:行的结束。 |
|
第二个字节的值为1:图象结束。 |
|
第二个字节的值为2:其后的两个字节表示下一个象素从当前开始的水平和垂直位置的偏移量。 |
压缩数据
|
扩展数据
|
03 04 | 04 04 04 |
05 06 | 06 06 06 06 06 |
00 03 45 56 67 00 | 45 56 67 |
02 78 | 78 78 |
00 02 05 01 | 从当前位置右移5个位置后向下移一行 |
02 78 | 78 78 |
00 00 | 行结束 |
09 1E | 1E 1E 1E 1E 1E 1E 1E 1E 1E |
00 01 | RLE编码图象结束 |
第二个字节的值为0:行的结束。 |
|
第二个字节的值为1:图象结束。 |
|
第二个字节的值为2:其后的两个字节表示下一个象素从当前开始的水平和垂直位置的偏移量。 |
压缩数据
|
扩展数据
|
03 04 | 0 4 0 |
05 06 | 0 6 0 6 0 |
00 06 45 56 67 00 | 4 5 5 6 6 7 |
04 78 | 7 8 7 8 |
00 02 05 01 | 从当前位置右移5个位置后向下移一行 |
04 78 | 7 8 7 8 |
00 00 | 行结束 |
09 1E | 1 E 1 E 1 E 1 E 1 |
00 01 | RLE图象结束 |
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
|
|
|
|
|
|
|
|
0人
|
了这篇文章 |