1、下载bmpinfo.exe小工具,看bmp文件的概览信息。
看到文件类型4d42,数据离起始偏移量,54位,这里是指54字节。其他字段自行搜资料。
2、查找像素点信息。使用hex编辑器即可,
这里再看一下,宽度和长度 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; };