BMP文件格式
偶尔在网上看到大神的笔记,现系统的学习一遍BMP格式
选用的BMP文件为 灰色lena图
用EditPlus以十六进制打开图片:
BMP介绍
BMP文件,又叫位图,是Windows中使用的图片格式。
文件格式:
1、bmp文件头(bmp file header):提供文件的格式、大小等信息
2、位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
3、调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
4、位图数据(bitmap data):就是图像数据
真彩色
24位图像,即R、G、B三种颜色各用8bit表示,称为真彩色,这种情况下不需要调色板,即位图信息后紧跟着的就是位图数据
预备知识
1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据。如数据0x1756在内存中的存储顺序为:
这种存储方式称为小端方式(little endian) , 与之相反的是大端方式(big endian)。
2. 以下所有分析均以字节为序号单位进行。
下面我们对从文件中拉出来的数据进行剖析:
文件头
Windows为bmp文件头作出如下定义:
typedef struct tagBITMAPFILEHEADER { UINT16 bfType; //文件类型,2Byte DWORD bfSize; //文件大小, 4Byte UINT16 bfReserved1; // 保留字段1, 2Byte UINT16 bfReserved2; // 保留字段2, 2Byte DWORD bfOffBits; // 数据与文件头的偏移量, 4Byte } BITMAPFILEHEADER;
其中:
对照文件,我们可见:
1、1-2:42 4d 为“BM”,表示Windows支持的位图格式,即指是BMP文件
2、3-5: 36 04 01 00 即0X00010436 等于66614 约为65kb
3、6-9:00 00 00 00 保留字段1和2
4、a-d:36 04 00 00 即0X00000436等于1078,即数据从1078处开始
一共14个字节
信息头
Windows定义信息头结构体如下:
对照数据文件:
1、0e-11:28 00 00 00 即0x00000028 等于40,即信息头大小为40bit
2、12-15:00 01 00 00 即0x00000100等于256,即图像宽度为255像素
3、16-19:00 01 00 00 即0x00000100等于256,即图像高度为255像素,且这是一个正数,说明图像数据是从图像左下角到右上角排列的
4、1a-1b:0100 即0x00010,等于1,即颜色平面数为1
5、1c-1d:0800 即0x0008.等于8,即每个像素占8bit
6、1e-21:00 00 00 00 即0,BI_RGB格式
7、22-25:00 00 01 00 即0x00010000 等于65536.指图像大小
8、26-29:00 00 00 00 等于0.水平分辨率
9、2a-2d:00 00 00 00 等于0 垂直分辨率
10、2e-31:00 01 00 00 即0x00000100 等于256,指实际使用的颜色索引数256
11、32-35:00 00 00 00 即0,指重要的颜色索引数为0
至此,文件头+信息头 = 64Byte
调色板
一张映射表,布局想二维数组[N][4],N指总的颜色所引数,每行四个元素对应B、G、R和Alpha值,一个分量一个字节,若无透明通道,则Alpha为0
对照数据文件:
本图中,N=256.即256个颜色索引
索引 | B | G | R | Alpha |
0 | 00 | 00 | 00 | 00 |
1 | 01 | 01 | 01 | 00 |
2 | 02 | 02 | 02 | 00 |
3 | 03 | 03 | 03 | 00 |
4 | 04 | 04 | 04 | 00 |
5 | 05 | 05 | 05 | 00 |
..... | ...... | ...... | ...... | ...... |
一共256种颜色,每个颜色占一个字节,一共是1024个字节,加上文件头和信息头的54字节,一共是1078个字节,即在数据之前有1078个字节
位图数据
每个像素占一个字节,取得该字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上,由于信息头中图像的高度为正数,故位图数据在文件中排列是从左下角到右上角,以行为主序排列的