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
BMP文件格式实例分析的更多相关文章
- BMP文件格式分析
前两天要做一个读取bmp文件的小程序,顺便查找了一些关于BMP格式的文章,现在post上来. 简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运 ...
- BMP文件格式详解
BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广 ...
- OpenGL学习--05--纹理立方体--BMP文件格式详解(转载)
http://blog.csdn.net/o_sun_o/article/details/8351037 BMP文件格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称 ...
- BMP文件格式具体解释
BMP文件格式具体解释(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统 ...
- 实例分析ELF文件静态链接
参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname ...
- BMP文件格式及读写
转 http://blog.csdn.net/pkueecser/article/details/5579604 http://blog.csdn.net/pkueecser/article/deta ...
- bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换
今日,有同事问我.rgb555模式下的位图文件的格式问题,于是花了一下午的时间通过推測与測试,分析出了例如以下bmp文件在rgb555模式下的文件存储规律: 1:bmp文件的文件信息头中的biBitC ...
- RPC原理及RPC实例分析
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...
- java基础学习05(面向对象基础01--类实例分析)
面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...
随机推荐
- django(2)基本指令
打开 Linux 或 MacOS 的 Terminal (终端)直接在 终端中输入这些命令(不是 python 的 shell中) 如果是 windows 用 cmd(开始 搜索 cmd 或者 快捷键 ...
- hihoCoder #1184 : 连通性二·边的双连通分量(边的双连通分量模板)
#1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老 ...
- 删除数据库所有存储过程的SQL语句
--/第1步**********删除所有表的外键约束*************************/ DECLARE c1 cursor for select 'alter table ['+ o ...
- getch与getchar区别
getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 getchar(): 所在头文件:stdio.h getch与getchar基本功能相同,差别是getc ...
- GitHub在线创建文件夹
点击New files按钮,然后输入含有slash字符(“/”)的文件名即可.也就是建立一个含有路径(目录)的文件,即会自动产生新文件夹. 点击Upload files按钮,然后直接把本地的文件夹(内 ...
- spark java API 实现二次排序
package com.spark.sort; import java.io.Serializable; import scala.math.Ordered; public class SecondS ...
- java异常查看利器之使用 jvmti 的Callback_JVMTI_EVENT_EXCEPTION 事件查看异常
阅读本文前需要了解什么是jvmti,jvmti全称称之为 JVM Tool Interface,有关jvmti更详细的知识,本文不再详细列出.大家可以借助百度来了解有关它更为详尽的内容. 在开源文件大 ...
- Django实战(6):对比RoR和Django的模板系统
scaffold的生成物虽然用处不大,但是给我们带来一些最佳实践.其中就有模板的继承和分区. 如果你深入使用过rails的模板体系,那么恭喜你:你有超强的忍耐力!而且更重要的是,你只需要3分钟就可以理 ...
- 20169211《linux内核原理与分析》第七周作业
1.教材内容学习总结 2.实验报告 3.学习总结 一.教材内容学习总结 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享 ...
- UVa210 Concurrency Simulator (ACM/ICPC World Finals 1991) 双端队列
Programs executed concurrently on a uniprocessor system appear to be executed at the same time, but ...