bmp位图文件结构
struct BMP
{
BITMAPFILEHEADER fileHeader; //文件头
BITMAPINFOHEADER infoHeader; //文件信息头
PALETTEENTRY palette[n]; //调色板信息,n为颜色数目
byte *pixels; //像素数据指针
};
文件头
typedef struct tagBITMAPFILEHEADER {
WORD bfType; 2
DWORD bfSize; 4
WORD bfReserved1; 2
WORD bfReserved2; 2
DWORD bfOffBits; 4
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
BM
bfType:两个字节,表示文件的类型,该值一般是0x4D42,也就是‘BM’
文件信息头
\x00\x00\x00\x00
bfSize : 四个字节,说明文件的大小,以字节为单位。文件总的大小=文件头字节数+信息头的字节数+调色板字节数+像素数据字节数。
\x00\x00
bfReserved1:保留数据,一般为0。
\x00\x00
bfReserved2:保留数据,一般为0
\x46\x00\x00\x00
bfOffBits:文件头到像素数据之间的字节偏移量,用来定位像素数据。这个参数非常有用,因为位图信息头和调色板的长度会根据不同的情况而有所变化,利用这个偏移量可以迅速读取到像素数据。其大小一般是:偏移量=文件头字节数+文件信息头字节数+调色板字节数。
调色板信息
位图信息头
BMP信息头在windows.h中被声明为:BITMAPINFOHEADER 。该结构完整的声明如下:
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;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
\x38\x00\x00\x00
biSize:4字节,说明BITMAPINFOHEADER结构所需的字节数,数值为sizeof(BITMAPINFOHEADER),一般是40字节,但也可能不是,具体要看系统。
可以是38 表示调色板长度为0
\x00\x00\x00\x00
biWidth:4个字节,说明图像的宽度,以像素为单位。
\x00\x00\x00\x00
biHeight:4个字节,说明图像的高度,以像素为单位。该值除了指示位图的高度之外,还可指示图像的方向:当该值为正数时,位图是倒向的,当该值为负数时,位图是正向的。一般位图都是倒向的,也就是该值一般是正数。
\x01\x00
biPlanes:2个字节,说明图像的位面数,一般就是1;
\x10\x00
biBitCount:2个字节,说明每个像素所具有的比特数。该值可以是1、4、8、16、24、32,一般来说,使用24色的位图,该值就是24。
\x03\x00\x00\x00
biCompression:4个字节,说明图像数据的压缩类型,其中:BI_RGB表示无压缩;BI_RLE8表示每个像素8比特的RLE压缩编码,压缩格式由2字节组成(重复像素计数和颜色索引);BI_RLE4表示每个像素4比特的RLE压缩编码,压缩格式由2字节组成;BI_BITFIELDS:每个像素的比特由指定的掩码决定;BI_JPEG:JPEG格式。
经测试:在bmp16位上,0表示x555 3表示565
\x00\xC8\x00\x00
biSizeImage:4个字节,说明图像的大小,以字节为单位,必须是4的倍数,当使用BI_RGB格式时,该值可以为0。
\xA0\x0F\x00\x00
biXPelsPerMeter:4个字节,水平分辨率,用像素/米表示,不知道就设为0
\xA0\x0F\x00\x00
biYPelsPerMeter:4个字节,垂直分辨率,用像素/米表示,不知道就设为0
\x00\x00\x00\x00
biClrUsed:4字节,说明位图实际使用的彩色表中颜色索引数,采用索引色时会用到,如果采用无压缩的RGB格式,这个值可以是0。
\x00\x00\x00\x00
biClrImportant:4个字节,说明对图像显示有重要影响的颜色索引数目,为0则表示都很重要。
调色板
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD
\x00
这里可能表示调色板所占长度(包含当前字节)
\xF8\x00\x00
该结构体占用四个字节,前三个表示颜色的三个分量,取值范围是0到255,分别是蓝、绿、红(不是红、绿、蓝),第四个是保留项,一般都是0
后面字节不知道是啥
\xE0\x07\x00\x00
\x1F\x00\x00\x00
\x00\x00\x00\x00
\x00\x00\x00\x00
\x00\x00\x00\x00\x00
相关资料:
32位转24位
https://blog.csdn.net/a2631388/article/details/84688040