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

发表评论

邮箱地址不会被公开。 必填项已用*标注