由四部分组成:
A.第一部分为位图文件头BITMAPFILEHEADER,它是一个结构体,定义如下:
typedef struct tagBITMAPFILEHEADER{
WORD bfType;/文件类型,必须是0x424D,即字符串“BM”
DWORD bfSize;/指定文件大小,包括这14个字节
WORDbfReserved1; /保留字,不用考虑
WORDbfReserved2; /保留字,不用考虑
DWORD bfOffBits;/从文件头到实际位图数据的偏移字节数
}BITMAPFILEHEADER;
这个结构的长度是固定的,为14个字节(WORD为无符号16位二进制整数,DWORD为无符号32位二进制整数)。
B.第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;/该结构的长度,为40
LONGbiWidth; / 图像的宽度,单位是像素
LONGbiHeight; / 图像的高度,单位是像素
WORDbiPlanes; / 位平面数,必须是1,不用考虑
WORDbiBitCount;/ 指定颜色位数,1为二值,4为16色,8为256色,16、24、32为真彩色 DWORDbiCompression; / 指定是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS
DWORD biSizeImage;/ 实际的位图数据占用的字节数
LONGbiXPelsPerMeter; / 目标设备水平分辨率,单位是每米的像素数
LONGbiYPelsPerMeter; / 目标设备垂直分辨率,单位是每米的像素数
DWORDbiClrUsed;/实际使用的颜色数,若该值为0,则使用颜色数为2的bitBitCount次方种
DWORDbiClrImportant; /图像中重要的颜色数,若该值为0,则所有的颜色都是重要的
} BITMAPINFOHEADER;
这个结构的长度是固定的,为40个字节(LONG为32为二进制整数)。
偏移 | 域的名称 | 长度/字节 | 内容 |
000Eh(14) | biSize | 4 | 文件信息头的长度40(28h):Windows |
00012h(18) | biWidth | 4 | 位图的宽度,以像素为单位 |
00016h(22) | biHeight | 4 | 位图的高度,以像素为点为 |
001Ah(26) | Biplanes | 2 | 位图的为平面数(该值总是为1) |
001Ch(28) | biBitCount | 2 | 每个像素的位平面数,有下面几种情况:1:单色位图4:16色位图8:256色位图16:16bit高彩色位图24:24bit真彩色位图32:32bit增强型真彩色位图 |
001Eh(30) | biCompression | 4 | 压缩说明:0:不压缩(用BI_RGB表示)1:RLE8,使用8位RLE压缩方式(用BI_RLE8表示)2:RLE4,使用4位RLE压缩方式(用BI_RLE4表示)3:Bitfields:位域存放方式(用BI_BITFIELDS表示) |
0022h(34) | biSizeImage | 4 | 位图数据的大小,以字节为单位。该数必须是4的倍数。当图像存储的是非压缩数据的时候,它的取值可以为0,实际上,此时位图数据的大小可以通过biBitCount,biWidth,biHeight等计算出来 |
0026h(38) | biXPelsPerMeter | 4 | 用像素/米表示的水平分辨率 |
002Ah(42) | biYPelsPerMeter | 4 | 用像素/米表示的垂直分辨率 |
002Eh(46) | biClrUsed | 4 | 位图使用的颜色数,如果为0则表示使用了全部可能的颜色 |
0032h(50) | biClrImportant | 4 | 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要 |
C.第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。真彩色图像不需要调色板,BITMAPINFOHEADER后直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
typedefstruct tagRGBQUAD
{
BYTE rgbBlue;//该颜色的蓝色分量
BYTE rgbGreen;//该颜色的绿色分量
BYTErgbRed;//该颜色的红色分量
BYTE rgbReserved;//保留值
} RGBQUAD;
D.第四部分是实际的图像数据,对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图像,图像数据就是实际的R、G、B值:
•对于2色位图:用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个
字节就可以表示8个像素;
•对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素;
• 对于256色位图,一个字节刚好可以表示1个像素;
色深24位的位图
★每一行的字节数必须是4的整数倍,如果不是,则需要补齐;(bitSizeImage中提到过)
★BMP文件的数据存放是从下到上,从左到右的。也就是说,从文件中最先读到的是图像最下面的左边第一个像素,然后是左边第二个像素,接下来是倒数第二行左边第一个像素,左边第二个像素,依次类推
每个像素用3个字节表示,顺序依次为红,绿和蓝的值。每行用0填充到4字节的边界。