bmp文件格式初探

1、下载bmpinfo.exe小工具,看bmp文件的概览信息。

bmp文件格式初探

看到文件类型4d42,数据离起始偏移量,54位,这里是指54字节。其他字段自行搜资料。

2、查找像素点信息。使用hex编辑器即可,

bmp文件格式初探

这里再看一下,宽度和长度 512像素,占用4字节,且是小端存储(低地址,存放低位)。

因为数据偏移量是54字节,所以真正的像素数据,从0x36开始。

这是,37,51,9e表示的是哪个位置的数据?通过1中的bmpinfo,获取到的像素有问题,不确定其他使用场景如何。

然后通过photoshop工具,尝试查找bmp图片4个顶点的像素信息,

图片左上角,(0,0)  193,111,74   c1,6f,4a(RGB)
图片右上角,(511,0)  146,78,55   92,4e,37(RGB)
图片右下角,(511,511)  76,46,44  4c,2e,2c  (RGB)

图片左下角    (0,511) 158,81,55  9e,51,37 (RGB)   ,  即bmp文本的第一个元素。

图片左下角水平+1位置 (1,511)  165,88,62 a5,58,3e,bmp第二个元素

综上可以看到,bmp的元素存放顺序是BGR,bmp文本的第一个元素,对应图片的左下角元素。

3、解析bmp文件时,需要注意结构体大小与平台有关。有些资料用到long int,但是bmp文本头信息,没有这么长的字段。

如果解析bmp头文件信息异常,可以sizeof(bmp_fileheader)看看,自己平台是否是14byte,如果不是,就要对结构体做一下调整。包括增加字节对齐,修改元素变量,看到有人用long int ,这个应该是不对的。

#pragma pack(2)   // 14字节,需要设置2字节对齐,否则编译器会分配16byte给结构体bmp_fileheader  

struct bmp_fileheader   //文件头,长度为14Byte固定  
{       short bfType;
        int bfSize;
        short bfReserved1;
        short bfReserved2;
        int bfOffBits;
};
 struct bmp_infoheader  //文件信息头,长度为40Byte固定 
 {      int biSize;
        int biWidth;
int biHeight;
short biPlanes;
  short biBitCount;
        int biCompression;
        int biSizeImage;
int biXPelsPerMeter;
        int  biYPelsPerMeter;  int biClrUsed;
        int biClrImportant;  };