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 ...
随机推荐
- getch与getchar区别
getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 getchar(): 所在头文件:stdio.h getch与getchar基本功能相同,差别是getc ...
- sublime text配置make工具
sublime text配置make工具 Linux下许多项目是用makefile来管理的,是用gcc+make等方式来编译和运行. 在只有tty的场合或年代,使用vim或emacs是不二选择:但在L ...
- 【转】AndroidStudio升到最新版本(3.1.2)之后
AndroidStudio升到最新版本(3.1.2)之后 暂时发现的需要大家注意的地方 1.androidstudio3无法导入moudle? 例如:我写了一个简单的项目,需要导入一个第三方的mo ...
- CentOS7.5搭建ELK6.2.4集群及插件安装
一 简介 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作支持具有复杂搜索功能和需求的应用程序的底层引擎/技术. 下载地址 ...
- O(n log log n)实现FGT和FLT(Fast GCD/LCM Transformation)
本文是作者看不懂分治FFT之后开始娱乐一下自己写的 看到一道题时候询问了正解后,推出了一个奇怪的变换,发现这个很Transformation,我和正解推出来的奇怪的东西是一样的,但还是想写一下思路.. ...
- USACO 6.4 Wisconsin Squares
Wisconsin Squares It's spring in Wisconsin and time to move the yearling calves to the yearling past ...
- Ionic Js九:列表操作
列表是一个应用广泛在几乎所有移动app中的界面元素.ionList 和 ionItem 这两个指令还支持多种多样的交互模式,比如移除其中的某一项,拖动重新排序,滑动编辑等等. <ion-list ...
- CentOS 使用命令设置代理
全局的代理设置, vim /etc/profile 添加下面内容 http_proxy = http://username:password@yourproxy:8080/ ftp_proxy = h ...
- html5+css3 h5页面生成的思路
<!DOCTYPE html><html style="height: 100%;"> <head> <meta charset=&quo ...
- JAVAEE——宜立方商城02:服务中间件dubbo、工程改造为基于soa架构、商品列表实现
1. 学习计划 第二天:商品列表功能实现 1.服务中间件dubbo 2.工程改造为基于soa架构 3.商品列表查询功能实现. 2. 将工程改造为SOA架构 2.1. 分析 由于宜立方商城是基于soa的 ...