|
本帖最后由 downtown56 于 2018-10-13 14:30 编辑
一、BMP格式文件按照数据排列顺序分为4部分:
1.位图文件头结构:14字节,结构体名称BITMAPFILEHEADER,包括格式校验、位图大小等信息
2.位图信息头结构:40字节,结构体名称BITMAPINFOHEADER,包括BMP的详细信息
3.调色板(color palette):可选(由BITMAPFILEHEADER的第5个属性判断),结构体名称RGBQUAD,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
4.位图数据:16位24位和32位位图直接表示RGB值,其他位图(如1,2,4,8位图)为调色板的索引值(最大为255)
注意:结构体BITMAPINFOHEADER和结构体数组RGBQUAD[1]组成结构体BITMAPINFO
二、BITMAPFILEHEADER结构体,14字节=2+4+2+2+4typedef struct tagBITMAPFILEHEADER {
WORD bfType; //2Byte,格式校验,必须为“BM”,即0x424D
DWORD bfSize; //4Byte,整个文件大小
WORD bfReserved1; //2Byte,保留,为0,不考虑
WORD bfReserved2; //2Byte,保留,为0,不考虑
DWORD bfOffBits; //4Byte,文件开头到位图数据区的偏移量,即前3个部分之和,若>14+40则有调色板,若=14+40则没有
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
三、BITMAPINFOHEADER结构体,40字节=4+4+4+2+2+4+4+4+4+4+4
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //4Byte,指定结构体的字节长度,为40
LONG biWidth; //4Byte,位图宽,单位:像素
LONG biHeight; //4Byte,位图高,单位:像素
WORD biPlanes; //2Byte,图像平面数,位图存储RGB数据,因此总为1
WORD biBitCount; //2Byte,用多少位去表示一个像素的颜色,可以为1,2,4,6,8,16,24,32
DWORD biCompression; //4Byte,压缩方式,0=不压缩,1=RLE8,2=RLE4
DWORD biSizeImage; //4Byte,实际位图数据的字节数,以4字节对齐,=((biWidth / 4 + ((biWidth % 4 + 9) / 10)) * 4) * biHeight
LONG biXPelsPerMeter; //4Byte,像素/米表示水平分辨率
LONG biYPelsPerMeter; //4Byte,像素/米表示竖直分辨率
DWORD biClrUsed; //4Byte,使用的调色板的索引总数,0=默认值(2^biBitCount)
DWORD biClrImportant; //4Byte,重要的颜色数,0=所有颜色都是重要的
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
注意:Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话数据的获取速度会有很大增益。BMP位图也顺应这一规律,所以位图数据的行字节数应是4的整数倍,若不足的用 0 补齐。这一规则影响上结构体的biSizeImage值和位图数据。不影响biWidth值,biWidth值是实际的行像素数。
四、RGBQUAD结构体,调色板,多少色位图就有多少个此结构体,由biBitCount确定,=16,24,32时没有调色表
typedef struct tagRGBQUAD {
BYTE rgbBlue; //蓝色分量
BYTE rgbGreen; //绿色分量
BYTE rgbRed; //红色分量
BYTE rgbReserved; //保留
} RGBQUAD;
五、位图数据
所有的DIB数据扫描行是自下而上的,DIB数据所表示的像素点是从图片的左下角开始,一直表示到图片的右上角结束。

|
|