BMP位图由4个部分组成:位图文件头,位图信息头,调色板,像素数据。
1.位图文件头
VC++中用BITMAPFILEHEADER数据结构定义位图头文件,它包含文件类型、文件大小、存放位置等信息,结构如下:
typedef struct tagBITMAPFILEHEADER
{
WORD byType; //说明文件的类型
DWORD bfSize; //说明文件的大小,以字节为单位
WORD bfReserved1; //保留,设置为0;
WORD bfReserved2; //保留,设置为0;
DWORD bfOffBits; //说明从BITMAPFILEHEARDER结构开始到实际图像数据陈列字节间的字节偏移量
}BITMAPFILEHEARDER;
这个结构的长度是固定的,为14字节,其中WORD为无符号16位二进制数,DWORD为无符号32位二进制数。
2.位图信息头
VC++中用BITMAPINFOHEADER数据结构定位位图信息头,它包含位图的大小、压缩类型和颜色格式等信息,其结构定义如下:
typedef struct BITMAPINFOHEADER
{
DWORD biSize; //本结构大小的字节数
LONG biWidth; //位图的宽度,单位为像素点
LONG biHeigh; //位图的高度,单位为像素点
WORD biPlanes; //目标设备位平面数,其值设置为1
WORD biBitCount; //像素的位数(1,4,8,24)
DWORD biCompression; //压缩方式,0为不压缩
DWORD biSizeImage; //压缩图像大小的字节数,压缩图像为0
LONG biXpelsPerMeter;//水平分辨率(像素点每米)
LONG biYpelsPerMeter;//垂直分辨率(像素点每米)
DWORD biClrUsed; //图像中使用的颜色数
DWORD biClrImportant;//重要色彩数,0表示都重要
}BITMAPINFOHEADER;
3.调色板
VC++中,调色板实际上定义为一个数组,共有biClrUsed个像素,每个元素的类型是一个RGBQUAD结构,其定义如下:
typedef struct tagRGBQUAD
{
BYTE rgbBlue; //指定蓝色分量
BYTE rgbGreen; //指定绿色分量
BYTE rgbRed; //指定红色分量
BYTE rgbReserved;//保留值
}RGBQUAD;
24位真彩色图像不使用调色板,因为位图中的RGB值就代表了每个像素的颜色,所以BITMAPINFOHEADER后直接就是像素数据
4.像素数据
紧跟在调色板之后的是图像数据字节阵列,用BYTE数据结构存储。图像的每一扫描行由表示图像的连续像素字节组成,每一行的字节数取决于图像的颜色数和图像的宽度。扫描行是由底向上存储的,也就是说,数据存放是从下到上,从左到右。