BMP文件格式实例分析

1. 以下为一个RGB565-16位BMP位图实际的部分数据:

00000000h: 42 4D 46 58 02 00 00 00 00 00 46 00 00 00 28 00 ; BMFX......6...(.

00000010h: 00 00 40 01 00 00 F0 00 00 00 01 00 10 00 03 00 ; ..@...?........

00000020h: 00 00 00 58 02 00 12 0B 00 00 12 0B 00 00 00 00 ; ...X............

00000030h: 00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00 ; .......?.?....

00000040h: 00 00 00 00 00 00 63 21 03 19 04 19 03 19 03 19 ; ......c!........

00000050h: 04 19 04 19 E4 18 04 21 04 19 04 19 04 19 04 19 ; ....?.!........

00000060h: 04 21 04 21 24 21 24 19 24 19 24 21 24 21 24 21 ; .!.!$!$.$.$!$!$!

00000070h: 24 21 24 21 45 21 65 21 45 21 65 29 44 21 64 21 ; $!$!E!e!E!e)D!d!

00000080h: 64 21 64 21 64 21 64 21 85 29 84 21 65 21 85 21 ; d!d!d!d!??e!?

00000090h: 65 21 85 21 65 21 65 21 65 29 65 29 65 29 65 21 ; e!?e!e!e)e)e)e!

000000a0h: 65 21 65 21 66 29 66 29 66 31 66 31 66 31 86 39 ; e!e!f)f)f1f1f1?

000000b0h: 86 31 86 31 66 39 65 31 A6 31 A6 31 66 21 A4 00 ; ??f9e1??f!?

000000c0h: 84 00 A4 08 C4 08 E4 08 E4 10 45 21 E7 39 E6 39 ; ?????E!??

......

VGA, RGB656, BMP header, (640x480), 70bytes:

42 4D 46 60 09 00 00 00 00 00 46 00 00 00 28 00
00 00 80 02 00 00 E0 01 00 00 01 00 10 00 03 00
00 00 00 60 09 00 12 0B 00 00 12 0B 00 00 00 00
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
00 00 00 00 00 00

 

2. BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列:

2.1 图像文件头 

  1)0-1B:图像文件头。424Dh=’BM’,表示是Windows支持的BMP格式。 

  2)2-5B:整个文件大小。46 58 02 00, 00025846h = 153670B。 

  3)6-9B:保留,必须设置为0。 

  4)10-13B:从文件开始到位图数据之间的偏移量。46 00 00 00,为00000046h=70,上面的文件头就是35字=70字节。 

  5)14-17B:位图图信息头长度。 

  6)18-21B:位图宽度,以像素为单位。40 10 00 00,为00000140h=320。 

  7)22-25B:位图高度,以像素为单位。F0 00 00 00,为000000F0h=240。 

  8)26-27B:位图的位面数,该值总是1。0100,为0001h=1。 

2.2 位图信息头 

  1)28-29B:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。T408支持的是16位格式。10 00为0010h=16。 

  2)30-33B:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。03 00 00 00为00000003h=3。 

  3)34-37B:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。00 58 02 00为00025800h=320x240x2=153600B。 

  4)38-41B:用象素/米表示的水平分辨率。12 0B 00 00为0000 120Bh=4619。 

  5)42-45B:用象素/米表示的垂直分辨率。12 0B 00 00为0000 120Bh=4619。

  6)46-49B:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。 

  7)50-53B:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。 

2.3 彩色板 

  1)54-69B:彩色板规范。对于调色板中的每个表项,用下述方法来描述RGB的值: 

  4字节用于蓝色分量  

  4字节用于绿色分量  

  4字节用于红色分量  

  4字节用于填充符(设置为0) 

  对于24-位真彩色图像就不使用彩色表,因为位图中的RGB值就代表了每个象素的颜色。但是16位r5g6b5位域彩色图像需要彩色表。

  图中彩色板为00F8 0000 E007 0000 1F00 0000 0000 0000,其中: 

  00 FB 00 00为FB00h=1111100000000000(二进制),是红色分量的掩码。 

  E0 07 00 00为07E0h=0000011111100000(二进制),是绿色分量的掩码。 

  1F 00 00 00为001Fh=0000000000011111(二进制),是红色分量的掩码。 

  00 00 00 00总设置为0。 

  将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐第个分量为一个字节,再把这三个字节按rgb组合,放入存储器(同样要反序),就可以转换为24位标准BMP格式了。 

  四、图像数据阵列 

  17)17-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。 

  按照前述r5g6b5彩色板规范,我们对图像最左下角手机上图像的的像素在24位模式中的rgb值进行推算(由于垂直翻转,这个像素在手机上看来实际上在左上角): 

  63 21为 2163h = 0010 0001 0110 0011b

  r=((2163h  & FB00h) >> 11) × 8 = 32 

  g=((2163h  & 07E0h) >> 5) × 4 = 44

  b=((2163h  & 001Fh) × 8 = 24 

 

 参考文章:

 BMP格式图像文件详析, http://www.thethirdmedia.com/pc/200407/20040722117029.shtm 

 

posted @ 2014-11-19 16:00  遥望星空  阅读(856)  评论(0编辑  收藏  举报