偶尔在网上看到大神的笔记,现系统的学习一遍BMP格式数组
选用的BMP文件为 灰色lena图布局
用EditPlus以十六进制打开图片:学习
BMP文件,又叫位图,是Windows中使用的图片格式。.net
文件格式:orm
一、bmp文件头(bmp file header):提供文件的格式、大小等信息blog
二、位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息索引
三、调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表图片
四、位图数据(bitmap data):就是图像数据内存
24位图像,即R、G、B三种颜色各用8bit表示,称为真彩色,这种状况下不须要调色板,即位图信息后紧跟着的就是位图数据get
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-2:42 4d 为“BM”,表示Windows支持的位图格式,即指是BMP文件
二、3-5: 36 04 01 00 即0X00010436 等于66614 约为65kb
三、6-9:00 00 00 00 保留字段1和2
四、a-d:36 04 00 00 即0X00000436等于1078,即数据从1078处开始
一共14个字节
Windows定义信息头结构体以下:
对照数据文件:
一、0e-11:28 00 00 00 即0x00000028 等于40,即信息头大小为40bit
二、12-15:00 01 00 00 即0x00000100等于256,即图像宽度为255像素
三、16-19:00 01 00 00 即0x00000100等于256,即图像高度为255像素,且这是一个正数,说明图像数据是从图像左下角到右上角排列的
四、1a-1b:0100 即0x00010,等于1,即颜色平面数为1
五、1c-1d:0800 即0x0008.等于8,即每一个像素占8bit
六、1e-21:00 00 00 00 即0,BI_RGB格式
七、22-25:00 00 01 00 即0x00010000 等于65536.指图像大小
八、26-29:00 00 00 00 等于0.水平分辨率
九、2a-2d:00 00 00 00 等于0 垂直分辨率
十、2e-31:00 01 00 00 即0x00000100 等于256,指实际使用的颜色索引数256
十一、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个字节
每一个像素占一个字节,取得该字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上,因为信息头中图像的高度为正数,故位图数据在文件中排列是从左下角到右上角,以行为主序排列的