BMP图像文件被分成4个部分:
位图文件头(Bitmap File Header)
位图信息头(Bitmap Info Header)
颜色表(Color Map)
位图数据(Data Bits 或 Data Body)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第一部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,长度固定为14字节。
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;//位图文件类型,0x4D42(即字符串“BM”),这里要注意,写错了图片会不显示的,用UE打开是42 4D
DWORD bfSize;//整个文件的大小
WORD bfReserved1;//保留字
WORD bfReserved2;//保留字
DWORD bfOffBits;//文件头到颜色表的大小
}BITMAPFILEHEADER, FAR * LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二部分为位图信息头BITMAPINFOHEADER,是一个结构体类型的数据结构,长度也是固定的,为40字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;//本结构长度,为40个字节
LONG biWidth;//位图宽度,以像素为单位
LONG biHeight;//位图高度
WORD biPlanes;//目标设备的级别,必须为1
WORD biBitCount;//位深,每个像素所占的位数(bit)
DWORD biCompression;//位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为windows定义常量)
DWORD biSizeImage;//实际的位图数据占用的字节数
LONG biXPelsPerMeter;//指定目标设备的水平分辨率单位是像素/米
LONG biYPelsPerMeter;//指定目标设备的垂直分辨率单位是像素/米
DWORD biClrUsed;//位图实际用到的颜色数,如果该值为0,则用到的颜色数为2的biBitCount次幂即2^biBitCount,如24位图2^24
DWORD biClrImportant;//位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的
}BITMAPINFOHEADER, FAR* LPBITMAPINFO, *PBITMAPINFOHEADER;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第三部分为颜色表,是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为0,则由biBitCount指定,即2的biBitCount次幂个元素)。RGBQUAD结构是一个结构体类型,占4个字节。
typedef struct tagRGBQUAD
{
BYTE rgbBule; //该像素索引颜色的蓝色分量
BYTE rgbGreen; //该像素索引颜色的绿色分量
BYTE rgbRed; //该像素索引颜色的红色分量
BYTE rgbReserved; //保留字
}RGBQUAD;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第四部分是位图数据即图像数据,记录了图像的每一个像素值。对于有颜色表的位图,位图数据就是该像素颜色在调色板中的索引值;对于真彩色(即24位图),位图数据就是实际的R、G、B值(三个分量的存储顺序是B、G、R)。