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 ...
随机推荐
- SQL SERVER中查询某个表或某个索引是否存在
查询某个表是否存在: 在实际应用中可能需要删除某个表,在删除之前最好先判断一下此表是否存在,以防止返回错误信息.在SQL SERVER中可通过以下语句实现: IF OBJECT_ID(N'表名称', ...
- mysql 导出数据库命令
mysqldump --socket=/data/mysql/mysql.sock -uroot -pfanzhuo -d stat1> stat1.sql
- C# POS 小票打印
网上查了好多资料终于让我捣鼓出来了! public partial class Models_JXC_Sale_actNewSalePage : WebPartBase { public string ...
- Vue.js中 watch(深度监听)的最易懂的解释[转]
https://blog.csdn.net/qq_36688143/article/details/81287535 taskData: { handler(v) { // watch 方法其实默认写 ...
- USACO 6.1 A Rectangular Barn
A Rectangular Barn Mircea Pasoi -- 2003 Ever the capitalist, Farmer John wants to extend his milking ...
- 2017冬季24集训模拟题-24星球的末日(Floyd)
24 星球的末日[问题描述]24 星球的世界末日就要到了 , 可是诺亚方舟还没有制造完成 . 为了制造诺亚方舟这个星球上的所有国家都站在统一战线 . 现在一共有n个国家 , 一个国家到另一个国家都有一 ...
- 最小圆覆盖 gym-102006 I
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...
- Dubbo中多注册中心问题与服务分组
一:注册中心 1.场景 Dubbo 支持同一服务向多注册中心同时注册, 或者不同服务分别注册到不同的注册中心上去, 甚至可以同时引用注册在不同注册中心上的同名服务. 2.多注册中心注册 中文站有些服务 ...
- Vue学习笔记进阶篇——Render函数
基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template ...
- Wannafly挑战赛9 B - 数一数
链接:https://www.nowcoder.com/acm/contest/71/B来源:牛客网 题目描述 设s,t为两个字符串,定义f(s,t) = t的子串中,与s相等的串的个数.如f(&qu ...