BMP 格式是什么
BMP(Bitmap)是一种常见的无损位图图像文件格式,是Windows操作系统中最早使用的图像格式之一,也是目前很多应用程序所使用的标准图像格式之一。
整体结构图,如下图所示
格式
BMP文件格式有多个版本,本文只介绍最基本的结构,从上图可以看到 Bitmap file header, DIB header 和 Pixel array 是必选的。
Bitmap file header
该结构主要用于识别文件和判断文件是否损坏。以 小端 的方式存储。
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //图片种类,BMP图片固定为BM,表示为十六进制就是0x4d42
DWORD bfSize; //该图片文件的大小
WORD bfReserved1; //保留字,不用管
WORD bfReserved2;//保留字,不用管
DWORD bfOffBits; //实际图片数据的偏移量,即`DIB`的偏移量,也即前三个结构体的大小
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
该结构体中,我们需要在意的只有两个属性:bfSize与bfOffBits,分别等于该图片文件的大小,以及DIB数据区前三个结构体的大小
示例分析
本文使用上图作为分析对象,大小为 100*100,存储 rgb 数据。黑色对应的 rgb 为(0,0,0),另一个橙色对应 rgb 为(255, 127, 39)
前面两个字节分别是 “BM"
接着是文件的大小 0x00007566(30054 = 100 * 100 * 3 + 14 + 40)
接着是4个字节的保留数据 0x00000000
最后是4个字节的 DIB 的偏移量 0x00000036 (54)
DIB header
DIB header 有多种变种,其他变种可以参考 wiki,本文只介绍最基本的结构体。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //指定此结构体的长度
LONG biWidth; //bmp图片的宽度
LONG biHeight; //bmp图片的高度
WORD biPlanes; //平面数,显示器只有一个平面,所以一般为1
WORD biBitCount; //颜色位数,目前一般用24位或32位
DWORD biCompression; //压缩方式,可以是0,1,2,0表示不压缩,BMP为不压缩,所以为0
DWORD biSizeImage; //实际位图数据占用的字节数.由于上面不压缩,所以这里填0即可
LONG biXPelsPerMeter; //X方向分辨率,即每米有多少个像素,可以省略
LONG biYPelsPerMeter; //Y方向分辨率,即每米有多少个像素,可以省略
DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数)
DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
这个结构体的信息量非常多,但需要我们填的其实并不多:
biSize:指定此结构体的长度,一般都直接为: sizeof(BITMAPINFOHEADER)即可
biWidth:图片宽度,需要自己根据需要填
biHeight:图片高度,需要自己根据需要填
biPlanes:平面数,填1即可
biBitCount:位数,本文采用的是24位图,所以填24
除了以上几个需要填的,其它都直接清零即可
示例分析
biSize 为 0x00000028(40)
width 为 0x00000064(100)
height 为 0x00000064(100)
biPlanes 为 0x0001
biBitCount 为 0x0018(24)
biCompression 为 0x00000000
biSizeImage 为 0x00007530(30000)
剩下的都为 0
pixel array
以 packed 的方式保存数据,每行数据以 4 字节对齐。
中间公式中括号(上面有横线)的意思应该是向上取整,后面括号是向下取整(下面有横向)
因为 ImageHeight 可能为负数,所以需要加绝对值。height 为整数,默认先存储左下角数据,负数,默认先存左上角数据。
保存数据,以保存 rgb 颜色为例,其从左下角开始保存数据,从左到右,从下到上。由于是小端,所以按照 B G R 的形式保存数据。
示例分析
左下角 bgr(0x27,0x7f, 0fff)
其他
代码保存 BMP 图片
bmp 可以保存 10bit 数据吗
透明分量怎么保存
参考文献
https://blog.csdn.net/weixin_50964512/article/details/128646165?ops_request_misc=&request_id=&biz_id=102&utm_term=bmp&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-128646165.nonecase&spm=1018.2226.3001.4187
https://en.wikipedia.org/wiki/BMP_file_format