[转] BMP文件格式
位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependent bitmap,DDB)文件格式。Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independent bitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的文件扩展名是BMP或者bmp。
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、颜色表(color table)和位图数据。
(1)位图文件头
文件头的信息主要包括与位图文件相关的信息,如文件类型、文件大小等,该部分信息共占14个字节。具体结构如表2-1 :
表2-1 位图文件头结构
起始字节 |
所占字节数 |
具体内容 |
标识 |
1 |
2 |
文件类型(windows位图为“BM”) |
bfType |
3 |
4 |
文件大小 |
bfSize |
7 |
4 |
保留 |
bfReserved |
11 |
4 |
第一个位图数据的开始字节位置 |
bfOffBits |
(2)位图信息头
位图信息头的主要内容为与图像相关的信息,如位图的高度与宽度,位图的大小等,该部分信息共占40个字节。具体结构如表2-2:
表2-2 位图信息头结构
起始字节 |
所占字节数 |
具体内容 |
标识 |
15 |
4 |
位图信息头的长度(一般为40) |
biSize |
19 |
4 |
位图的宽度 |
biWidth |
23 |
4 |
位图的高度 |
biHeight |
27 |
2 |
位图的位面数(=1) |
biPlanes |
29 |
2 |
每个像素所占位数(1,4,8,24等) |
biBitCount |
31 |
4 |
位图压缩类型 ( 0或BI_RGB——未压缩, 1或BI_RLE8——RLE8压缩 2或BI_RLE4——RLE4压缩 3 或BI_BITFIELDS) |
biCompression |
35 |
4 |
图像的大小(以字节为单位,必须是4的倍数) |
biSizeImage |
39 |
4 |
位图水平分辩率(像素/米) |
biXPelsPerMeter |
43 |
4 |
位图垂直分辩率(像素/米) |
biYPelsPerMeter |
47 |
4 |
位图实际使用的颜色数(=0使用所有颜色) |
biClrUsed |
51 |
4 |
指定重要的颜色数(=0 都重要) |
biClrImportant |
(3)颜色表
该部分含有多个表项,每个表项的占4个字节。对于24位真彩图像是没有这部分内容。具体结构如表2-3:
表2-3 颜色表中的第1个表项的结构
起始字节 |
所占字节数 |
具体内容 |
标识 |
55 |
1 |
蓝色的亮度值 |
rgbBlue |
56 |
1 |
绿色的亮度值 |
rgbGreen |
57 |
1 |
红色的亮度值 |
rgbRed |
58 |
1 |
保留 |
rgbReserved |
颜色表中的表项个数由biBitCount确定,为2biBitCount个表项,因此颜色表的总长度为2biBitCount×4个字节。
(4)位图数据
该部分的大小取决于压缩方法,它包含所有的位图数据,这些数据的值取决于biBitCount的值。具体结构如表2-4:
表2-4 位图数据结构
biBitCount |
颜色表项数 |
说 明 |
1 |
2 |
象素值为0时,使用第一项颜色,为1时使用第二项颜色。 |
4 |
16 |
若点阵位图数据中某个字节为OX1F,则该字节代表2个象素。第一个象素用第2项颜色,第二个象素用第16项。 |
8 |
256 |
点阵位图中每一个字节表示一个象素。 |
24 |
0 |
无颜色表。位图数据中三个字节表示一个象素的红、绿、蓝值。 |
biBitCount=1 表示位图最多有两种颜色,黑色和白色。图像数据中的每一位(0或1)表示一个像素(黑色或白色)。
biBitCount=4 表示位图最多有16种颜色。每个像素用4位表示,并用这4位作为颜色表的表项来查找该像素的颜色。例如,如果位图中的第一个字节的十六进制数为1F,它表示两个像素,第一像素的颜色就在颜色表的第2表项中查找,第二个像素的颜色在颜色表的第16表项中查找。
biBitCount=8 表示位图最多有256种颜色。每个像素用8位表示,并用这8位作为颜色表的表项来查找该像素的颜色。例如,如果位图中的第一个字节的十六进制数为1F,这个像素的颜色就在颜色表的第32表项中查找。
biBitCount=24 表示位图最多有224=16 777 216种颜色。颜色表为空。每3个字节代表一个像素,每个字节分别表示R、G、B三分量的值。
位图数据的存放顺序是从图像中的最后一行到第一行,每一行的顺序是从左到右。值得一提的是,每一行像素所占的字节数必须是4的整倍数,如果实际像素所占字节数不足4的倍数,则需要补齐,下一行像素值也是从4的倍数字节处后开始存放。