参考:
测试图片:rgb.bmp(R: 0xFE0000, G: 0x00FE00, B: 0x0000FE)
文件头,固定14字节,最后4字节表示图像数据的起始位置。
typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } __attribute__((packed)) BITMAPFILEHEADER, *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER; |
位图信息头,根据头4字节大小来确定用了哪种版本的位图信息头,一般是40,表示使用Windows V3版本的信息头。
typedef struct tagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } __attribute__((packed)) BITMAPINFOHEADER, *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER; |
调色板,可选,其实是一个结构体数组,每个结构体占4字节,表示调色板中的一种颜色,当每个像素的深度大于24bit时,不需要调色板,如下:
typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } __attribute__((packed)) RGBQUAD; |
位图数据,存储像素内容,排布规则是从左下到右上,24位RGB按照BGR的顺序来存储,32位RGBA按BGRA顺序存储,每行数据的内容按4字节对齐,不够时补0。
Note:RGB565模式下,调色板对应的其实是16bit中RGB分量对应的掩码。