位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据
位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义:
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中的bfType值应该是“BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小。
位图信息中所记录的值用于分配内存,设置调色板信息,读取像素值等。
以下是位图信息结构的定义:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
可见位图信息也是由两部分组成的:位图信息头 + 颜色表
颜色表是由颜色表项组成的,颜色表项结构的定义如下:
typedef struct tagRGBQUAD { // rgbq
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD; 其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。
位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义:
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
下表是对结构体当中各个成员的说明:
| 结构成员 |
说 明 |
| biSize | 结构BITMAPINFOHEADER的字节数,即sizeof(BITMAPINFOHEADER)* |
| biWidth |
以像素为单位的图像宽度* |
| biHeight |
以像素为单位的图像长度* |
| biplanes |
目标设备的位平面数 |
| biBitCount |
每个像素的位数*(1) |
| biCompression |
图像的压缩格式(这个值几乎总是为0) |
| biSizeImage |
以字节为单位的图像数据的大小(对BI_RGB压缩方式而言) |
| biXPelsPermeter |
水平方向上的每米的像素个数 |
| biYpelsPerMeter |
垂直方向上的每米的像素个数 |
| biClrused |
调色板中实际使用的颜色数(2) |
| biClrImportant |
现实位图时必须的颜色数(3) |
说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量
原文:http://my.oschina.net/DCode/blog/308869