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

BMP文件格式实例分析的更多相关文章

  1. BMP文件格式分析

    前两天要做一个读取bmp文件的小程序,顺便查找了一些关于BMP格式的文章,现在post上来. 简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运 ...

  2. BMP文件格式详解

    BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广 ...

  3. OpenGL学习--05--纹理立方体--BMP文件格式详解(转载)

    http://blog.csdn.net/o_sun_o/article/details/8351037 BMP文件格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称 ...

  4. BMP文件格式具体解释

    BMP文件格式具体解释(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统 ...

  5. 实例分析ELF文件静态链接

    参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname ...

  6. BMP文件格式及读写

    转 http://blog.csdn.net/pkueecser/article/details/5579604 http://blog.csdn.net/pkueecser/article/deta ...

  7. bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换

    今日,有同事问我.rgb555模式下的位图文件的格式问题,于是花了一下午的时间通过推測与測试,分析出了例如以下bmp文件在rgb555模式下的文件存储规律: 1:bmp文件的文件信息头中的biBitC ...

  8. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  9. java基础学习05(面向对象基础01--类实例分析)

    面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...

随机推荐

  1. 20155309南皓芯2016-2017 2《Java程序设计》第一周学习总结

    关于java学习笔记的思考问题 第一章:JDK与JRE,JVM之间有没有必然的联系 第二章:可执行文件夹找到相关链接库 第三章:for与while循环的用法与比较,break与continue跳出的注 ...

  2. wordpress 常用函数-wpdb类

    与数据库建立接口 WordPress为用户提供了一系列用于数据库操作的函数类——wpdb.Wpdb类建立在Justin Vincent编写并维护的ezSQL类的基础上. 使用须知 不可直接调用wpdb ...

  3. <未来世界的幸存者> 读后感(现实篇和职业篇)【原创】

    摘要: 前几天有幸看到阮老师的 <未来世界的幸存者)>,花了几晚的时间阅读完毕,内心受到了很大的触动,现在将感觉不错的地方记录下. 职业篇 1. 为什么雇佣制度对工人不利? 雇佣制度是一种 ...

  4. python开发学习-day15(前端部分知识、web框架、Django创建项目)

    s12-20160430-day15 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  5. 【Java】 String类型的==使用

    public class StringDemo { public static void main(String[] args) { String s1 = "abc"; Stri ...

  6. vue 中 使用 tradingview

    加载页面时初始化方法: mounted 可以在 mounted 方法中调用 methods 的中的方法 使用 data 中的数据时,在每个方法的开始推荐先定义 var that = this 现在还不 ...

  7. mysql插入数据时,去掉重复的数据;

    1. 利用insert ignore into语句去重 mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VA ...

  8. 解决命令行运行python文件,出现No module named *** 报错问题

    有时候在一个项目中运行的时候,可能是之前已经mark成sources root 你自己忘记了, 于是就在命令行也执行python文件,然后就出现 No module named *** 等 相关你认为 ...

  9. [leetcode greedy]45. Jump Game II

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  10. Django ORM训练专题

    图书信息系统 表结构设计 # 书 class Book(models.Model): title = models.CharField(max_length=32) publish_date = mo ...