一、使用到的结构体
- BMP文件头结构。注意该结构的字节对齐,尤其是自定义该结构体时要引起高度重视,否则会引发BMP文件头无效。
typedef struct tagBITMAPFILEHEADER
{
unsigned short bfType; //位图文件的类型,必须为BM
unsigned long bfSize; //文件大小,以字节为单位
unsigned short bfReserverd1; //位图文件保留字,必须为0
unsigned short bfReserverd2; //位图文件保留字,必须为0
unsigned long bfbfOffBits; //位图文件头到数据的偏移量,以字节为单位
}BITMAPFILEHEADER;
2.BMP信息头结构
typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize; //该结构大小,字节为单位
long biWidth; //图形宽度以象素为单位
long biHeight; //图形高度以象素为单位
unsigned short biPlanes; //目标设备的级别,必须为1
unsigned short biBitcount; //颜色深度,每个象素所需要的位数
unsigned long biCompression; //位图的压缩类型
unsigned long biSizeImage; //位图的大小,以字节为单位
long biXPelsPermeter; //位图水平分辨率,每米像素数
long biYPelsPermeter; //位图垂直分辨率,每米像素数
unsigned long biClrUsed; //位图实际使用的颜色表中的颜色数
unsigned long biClrImportant; //位图显示过程中重要的颜色数
}BITMAPINFOHEADER;
3.BMP颜色表结构(调色板)
typedef struct tagRGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
}RGBQUAD;
二、数据填充
所有保留字段都要置为0,否则会出错。
图像宽度必须为四的整数倍((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8);
1. BITMAPFILEHEADER
bfType为图像文件格式,就此题而论,总是设置为0x4D42即“BM”;
bfSize为BMP文件的大小,应设置为:BMP文件头大小+BMP信息头大小+[调色板信息大小+]图像大小,即:sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +[ 256 * sizeof(RGBQUAD) +] imgHeight * imgWidth*bytePerPixel。图像尺寸大小不包括颜色通道数量信息;
bfbfOffBits为图像数据的偏移字节。应设置为:BMP文件大小+BMP信息头大小[+调色板信息大小],计算方法参考上一字段;
2. BITMAPINFOHEADER
biSize该结构大小,一般设置为40,推荐使用sizeof(BITMAPINFOHEADER)方式设置;
biWidth 图像宽度,毋庸多言;
biSizeImage
biHeight 图像高度;
biPlanes 位图的位面数(目标设备级别),此处设置为1;但也有设置为零的,可见不一定为1;
biBitcount 位图每个像素所需位数,根据实际情况设置;1:为双色;4:十六色;8:256色;24或32:真彩色;
biCompression位图压缩类型,必须是0; 1:BI_RLE8压缩类型;2:BI_RLE4压缩类型;3:Bitfields,位域存放;
RLE:全称(run-length encoding),翻译为游程编码;
biSizeImage位图数据大小,即imgHeight*imgWidth*bytePerPixel;
biXPelsPermeter用像素/米表示的水平分辨率
biYPelsPermeter用像素/米表示的垂直分辨率
biClrUsed位图所使用的颜色数
biClrImportant对位图显示有重要影响的颜色索引数。如果为零,意味着都重要;
3. RGBQUAD
rgbBlue蓝色分量的亮度0~255;
rgbGreen绿色分量的亮度0~255;
rgbRed红色分量的亮度0~255;
rgbReserved保留分量,个人分析是Alpha分量的值,该值必须为0;
4.位图数据部分
上下左右倒置结构,左上角的像素点位于文件结尾,右下角的像素数据位于位图数据段的起点。