BMP图片格式

孤者浪人 提交于 2019-12-24 15:08:53

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。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!