BMP图片
BMP采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit和32bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。BMP图片格式后缀为BMP或者bmp。
注意:数值在存储上都是按“高位放高位、低位放低位的原则”,如12345678h放在存储器中就是7856 3412)。
BMP文件分为四个部分,分别是位图文件头、位图信息头、彩色板、图像数据阵列。
例如:424D 4690 0000 0000 0000 4600 0000*2800 0000 8000 0000 9000 0000 0100 1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 ........
在分析中为了简化叙述,以一个字(两个字节为单位,如424D就是一个字)为序号单位进行。
1. 位图文件头。长度为32个字节
1)1 文件标识符 424D="BM"标识windows支持的bmp格式
2)2-3 整个文件的大小 4690 0000为 00009046h=36934字节
3) 4-5 保留一般都为0
4)6-7 文件开始到数据开始的偏移量。4600 0000为00000046h=70字节。这个很有用,可以获取bmp数据阵列的地址。
2. 位图的信息头。长度为26个字节
1)8-9 位图图信息头长度。2800 0000 为00000028h=40字节。
2)10-11 位图的宽度,以像素为单位。8000 0000 为 00000080h=128
3)12-13 位图的高度,以像素为单位。9000 0000 为 00000090h=144
4)14 位图的位面熟。0100总是为1.
5)15 每个像素的位数,有1bit,4bit,8bit,16bit,32bit。1000 为 0010h=16bit
6)16-17 压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。0300 0000为00000003h=3。
7)18-19 用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864字节。
8)20-21:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
9)22-23:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
10)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
11)26-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。
3. 彩色板。16字节
1)28-35:彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值: 1字节用于蓝色分量 1字节用于绿色分量 1字节用于红色分量 1字节用于填充符(设置为0) 对于24-位和32位真彩色图像就不使用彩色表,因为位图中的RGB值就代表了每个象素的颜色。但是16位r5g6b5位域彩色图像需要彩色表,看前面的图,与上面的解释不太对得上,应以下面的解释为准。 图中彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00FB 0000为FB00h=1111100000000000(二进制),是红色分量的掩码。
E007 0000为 07E0h=0000011111100000(二进制),是绿色分量的掩码。
1F00 0000为001Fh=0000000000011111(二进制),是红色分量的掩码。
0000 0000总设置为0。
将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式了。
4. 数据流格式
1)36-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。按照前述r5g6b5彩色板规范,我们对图像最左下角手机上图像的的像素在24位模式中的rgb值进行推算(由于垂直翻转,这个像素在手机上看来实际上在左上角):
02F1 为 F102h
r=(F102 AND FB00)/ 800 × 8 h= F0h=240
g=(F102 AND 07E0)/ 20 × 4 h=20h=32
b=(F102 AND 001F)× 8 h= 10h=16
rgb=F02010h,放在存储器中为1020F0h。
来源:https://www.cnblogs.com/545235abc/p/4095580.html