BMP文件结构如表:
位图文件头结构 | BITMAPFILEHEADER |
位图信息头结构 | BITMAPINFOHEADER |
位图颜色表 | RGBQUAD |
位图数据 |
(1)位图文件头
它含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下:
typedef struct tagBITMAPFILEHEADER{
WORD bfType;//位图文件的类型,必须为BMP
DWORD bfSize;//位图文件的大小,以字节为单位
WORD bfReserved1;//位图文字保留字,必须为0
WORD bfReserved2;//位图文字保留字,必须为0
DWORD bfOffBits;//位图数据起始位置,以相对于文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;
(2)位信息头
BMP位图信息头结构用于说明位图的尺寸等信息。其结构定义如下:
typedef struct tagBITMAPINFOHEADER{
DOWN biSize;//本结构所占字节数
LONG biWidth;//位图的宽度,以像素为单位
LONG biHeight;//位图的高度,以像素为单位
WORD biPlanes;//目标设备的级别,必须为1
WORD biBitCount;//每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)、24(真彩色)之一
DWORD biCompression;//位图压缩类型,必须是0(不压缩)、1(B1_RLE8压缩类型),或2(B1_RLE4压缩类型)之一
DWORD biSizeImage;//位图的大小,以字节为单位
LONG biXPelsPerMeter;//位图水平分辨率,每米像素数
LONG biYPelsPerMeter;//位图垂直分辨率,每米像素数
DWORD biClrUsed;//位图实际使用的颜色表中的颜色数
DWORD biClrImportant;//位图显示过程中重要的颜色数
}BITMAPINFOHEADER;
(3)颜色表
8位位图中,每个像素占8位,可表示256种颜色,8位位图文件含有颜色表,而真彩色位图文件中不含颜色表。颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,用于定义一种颜色。
RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD{
BYTE rgbBlue;//蓝色的亮度,值范围为0-255
BYTE rgbGreen;//绿色的亮度,值范围为0-255
BYTE rgbRed;//红色的亮度,值范围为0-255
BYTE rgbReserved;//保留,必须为0
}RGBQUAD;
在颜色表中,RGBQUAD结构数据中的个数由biBitCount来决定。当bitBitCount=1、4、8时,分别有2、16、256个表项。
当bitBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO{
BITMAPINFOHEADER bitHeader;//位图信息头
RGBQUAD bmiColors[1];//颜色表
}BITMAPINFO;
(4)位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内从左到右,扫描行之间从下到上。位图的一个像素值所占的字节数如下。
bitBitCount | 说明 |
---|---|
1 | 8个像素占1个字节 |
4 | 2个像素占1个字节 |
8 | 1个像素占1个字节 |
24 | 1个像素占3个字节 |
位图像素值的位数可为1、4、8和24,其图像的颜色数分别为2、16、256和真彩色。其中前3种有对应的颜色表,而24位位图的颜色表为空,其像素值就是颜色值。如果BITMAP、INFOHEADER的biClrUsed域不为"0",则其值为位图所使用的颜色数,也即是颜色表的表项数;如果该域为"0",则位图的颜色表的表项数为满的,即像素颜色位数为1、4、8,则其颜色表项数分别为2、16、256。颜色表中一般将最重要的颜色排在前面。
8位位图的数据紧跟在颜色表后面,其数据是颜色表的索引值,数据可以是不压缩的,也可以是压缩的。对4位位图和8位位图,可以采用RLE(游程长度编码)压缩,分别称为RLE4和RLE8位图。位图数据以行为单位存储,每行都被填充到一个4字节边界,即每行所占的存储长度总是4字节(32位的倍数),不足时多余位将用"0"填充。位图行的存储次序是颠倒的,即位图文件中第一行数据对应的是位图的最底行。对于像素位数为1的DIB位图,其每个像素只占1位,每个字节存储8个像素。字节的最高位对应最左边像素。在像素位数为24的DIB位图中,每个像素占3个字节,从左到右的每一个字节分别存储蓝、绿、红的颜色值,每行用"0"填充到一个4字节边界。