大家好,今天小编来为大家解答深入解析BMP文件格式:全面指南这个问题,很多人还不知道,现在让我们一起来看看吧!
我们一般看到的图像主要是24位图像,即R、G、B三种颜色各用8位来表示。此类图像称为真彩色。在这种情况下,不需要调色板。即位图数据后面紧跟着位图信息头。
因此,我们经常会看到这样的说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。我们来分析一张具体的图像,看看这四个数据段在位图文件中的排列和组成。
我们使用的图像如下所示:
这是一个16 位位图文件,因此它包含一个调色板。
在拉出图像数据进行分析之前,我们首先做几个约定:在BMP文件中,如果一条数据需要用几个字节来表示,那么存储该数据的字节顺序是“低地址村存储低-位数据”,高地址存储高位数据。”例如数据0x1756在内存中的存储顺序为:
这种存储方式称为little endian,相反的就是big endian。对两者的使用感兴趣的可以深入研究一下,里面还是有学问的。以下所有分析均以字节为序号单位进行。
下面我们分析一下从文件中拉取的数据:
1.bmp****文件头Windows为bmp文件头定义了如下结构: typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType;
DWORD bfSize;
UINT16 bfReserved1;
UINT16 bfReserved2;
DWORD bfOffBits;
位图文件头;其中:
对比文件数据我们看到:
1-2:424dh="BM",表示这是Windows支持的位图格式。有许多说法认为前两个字节必须是“BM”才能成为位图文件。从上表可以看出,前两个字节必须是“BM”才能成为Windows位图文件。
3-5:00010436h=66614 B=65.05 kB,与查询文件属性一致。
6-9:这是两个保留段,均为0。
A-D:00000436h=1078。即文件头到位图数据的偏移量为1078字节。我们稍后会验证该数据。
总共有14个字节。
2.位图信息头同样,Windows为位图信息头定义了如下结构:
代码**
对照数据File:0E-11: 00000028h=40,也就是说我的位图信息头的大小是40字节。之前我们说过,位图信息头一般有40个字节。既然如此,为什么这里还有一个字段需要解释呢?这里涉及到一些历史。事实上,位图信息头原本有多种尺寸的版本。我们看一下下表:
出于兼容性原因,大多数应用程序使用旧版本的位图标头来保存文件。 OS/2已经过时了,所以现在最常用的格式只有V3 header。因此,我们前面说过位图信息头的大小是40字节。
12-15:00000100h=256,图像宽度为255像素,与文件属性一致。
16-19:00000100h=256,图像高度为255像素,与文件属性一致。这是一个正数,表示图像数据从图像的左下角到右上角排列。
1A-1B:0001h,值始终为1。
1C-1D:0008h=8,表示每个像素占8位,即图像共有256种颜色。
1E-21:00000000h,BI_RGB,表示该图像没有被压缩。
22-25:00000000h,图像的大小,因为使用了BI_RGB所以设置为0。
26-29:00000000h,水平分辨率,默认。
2A-2D:00000000h,垂直分辨率,默认。
2E-31:00000100h=256,表明该位图实际使用的颜色索引为256,与1C-ID得到的结论一致。
32-35:00000100h=256,说明该位图的重要颜色索引号为256,与前面得到的结论一致。
3.调色板以下数据为调色板。前面提到过,调色板实际上是一个映射表,标识了颜色索引号与其所代表的颜色之间的对应关系。它在文件中的布局就像一个二维数组palette[N][4],其中N代表颜色索引的总数,每行的四个元素分别代表B、G、R和对应索引的Alpha。每个分量占用一个字节。如果没有透明通道,Alpha为0。前面我们知道,这张图像有256个颜色索引,所以N=256。索引号就是该行的行号,对应的颜色就是该行的四个元素。下面截取一些数据来说明:
索引:(蓝,绿,红,Alpha)0号: (fe, fa, fd, 00)
1号:(fd,f3,fc,00)
2号:(f4,f3,fc,00)
3号:(fc、f2、f4、00)
4号:(f6,f2,f2,00)
数字5:(fb、f9、f6、00) 等等。
总共有256种颜色,每种颜色占用4个字节,总共1024个字节。再加上前面的54个字节的文件信息头和位图信息头加起来总共1078个字节。也就是说,位图数据出现之前总共有1078个字节,这与我们在文件信息头中得到的信息一致:文件头到文本图像数据区的偏移量是1078个字节!
4. 位图数据**
以下是位图数据。每个像素占用一个字节。获得该字节后,以该字节为索引来查询对应的颜色并显示在对应的显示设备上。
注意:由于位图信息头中的图像高度为正数,因此位图数据在文件中从左下角到右上角按行优先顺序排列。也就是说我们看到的第一个像素60是图像左下角的数据,第二个像素60是图像最后一行第二列的数据,……直到最后一列数据最后一行的倒数,后面是第二行第一列的数据,以此类推。
如果图像是24位或32位数据的位图,则位图数据区域不是索引而是实际的像素值。下面解释一下此时位图数据区中各个像素点的RGB颜色数组排列:
24位RGB按BGR顺序存储每个像素的每个颜色通道的值。当一个像素的所有颜色分量值存储完毕后,再存储下一个像素,不进行交错存储。
32位数据按照BGRA的顺序存储,其余与24位位图相同。
像素的排列规则与上述一致。
对齐规则讲完了像素的排列规则和每个像素的颜色分量的排列规则,最后讲一下数据的对齐规则。我们知道Windows中默认的最小扫描单位是4字节。如果数据对齐满足这个值,将大大提高数据采集速度。因此,BMP图像就符合这个要求,要求每行数据的长度必须是4的倍数,如果不够,就需要进行位填充(用0填充),这样可以按行快速访问。实现了。此时,位图数据区域的大小可能无法用图片宽度每像素字节数图片高度来表示,因为每一行也可能需要位填充。
填充后每行的字节数为:
,其中BPP(每像素位数)是每像素的位数。
在程序中,我们可以表示为:
int iLineByteCnt = (((m_iImageWidth * m_iBitsPerPixel) + 31) 5) 2;这样,位图数据区的大小为:
** m_iImageDataSize=iLineByteCnt * m_iImageHeight;**
当我们扫描完一行数据后,接下来的数据可能不是下一行的数据,我们可能需要跳过一段padding数据:
** 跳过=4 - ((m_iImageWidth * m_iBitsPerPixel)3) 3;**
五、拾遗至此,我们通过分析一个具体的位图文件示例,详细分析了位图文件的构成。需要说明的是:我们主要讨论的是PC上位图文件的构成。对于嵌入式平台,调色板数据段可能与PC不同。例如,嵌入式平台上常见的16位r5g6b5位图实际上是使用掩码而不是索引来表示图像。此时调色板数据段中有四个部分,每个部分为四个字节,实际上代表了颜色版本规格。现在:
第一部分是红色分量的掩模
第二部分是绿色分量的掩模
第三部分是蓝色分量的掩模
第四部分是Alpha分量的mask(默认为0)
文件中典型的调色板规范顺序为:
00F8 0000 E007 0000 1F00 0000 0000 0000
在
00F8 0000 就是FB00h=1111100000000000(二进制),它是蓝色和红色分量的掩码。 E007 0000即07E0h=0000011111100000(二进制),即绿色分量的掩码。 1F00 0000 就是001Fh=0000000000011111(二进制),它是蓝色分量的掩模。 0000 0000 设置为0。
通过对mask和像素值进行“与”运算,然后进行移位运算,就可以得到各个颜色分量的值。看mask就可以明白,其实每个像素值的16位的两个字节中,从高到低取的5、6、5位分别是r、g、b分量值。取出分量值后,将r、g、b值分别乘以8、4、8,将每个分量补全为一个字节。然后将这三个字节按照BGR组合起来放入内存中,就可以转换成24位标准BMP格式了。
这样,我们假设文件中表示为02 F1的位图数据区中有一个像素数据。这个数据实际上应该是F102:
r=(F102 和F800) 8=F0h=240
g=(F102 与07E0) 3=20h=32 b=(F102 与001F) 3=10h=16
此时我们就可以显示它了。 (本文结束)
参考资源:*维基百科BMP 文件格式*http://en.wikipedia.org/wiki/BMP_file_format
*gwwgle的专栏BMP格式详细解释* [http://blog.csdn.net/gwwgle/archive/2009/11/06/4775396.aspx](http://blog.csdn.net/gwwgle/archive/2009/11/06/4775396.aspx) *匿名BMP格式图像详细分析文件*[http://www.thethirdmedia.com/pc/200407/20040722117029.shtm](http://www.thethirdmedia.com/pc/200407/20040722117029.shtm)*Singler的列位图文件(BMP)格式分析和程序实现*[http://blog.csdn.net/yyfzy/archive/2006/06/10/785945.aspx](http://blog.csdn.net/yyfzy/archive/2006/06/10/785945.aspx) 转载自:http://www .cnblogs.com/Matrix_Yao/archive/2009/12/02/1615295.html
【FILE HEADER 实例图解】14 bytestypedef struct { /* type : Magic 标识符,通常为BM(0x42,0x4d)/unsigned Short int 类型; unsigned int size;/文件大小(以字节为单位),所有文件大小/unsigned Short int returned1,reserved2; /保留位/unsigned int offset;/图像数据的偏移量,字节*/} FILEHEADER;
type:2个字节,通常为"B"(0x42),"M"(0x4D)
size:4字节,记录BMP文件的大小,0x436=1078字节
reserved1:保留位,2字节
reserved2:保留位,2字节
offset: 4 字节,0x36=54 字节【INFO HEADER实例图解****】40 bytestypedef struct { unsigned int size;/* Info Header 大小(以字节为单位)/int width,height;/图像的宽度和高度/unsigned Short intplanes;/Number颜色平面/无符号短整型位; /每像素位数/无符号整数压缩; /压缩类型/unsigned int imagesize; /图像大小(以字节为单位)/int xresolution,yresolution; /每米像素/unsigned int ncolours; /颜色数量/unsigned int importantcolours; /重要颜色*/} INFOHEADER;
size:4字节,0x28=40字节,表示Info Header最大长度总共40字节
width:4字节,0x10=16,图像宽度为16像素
height:4字节,0x10=16,图像高度为16像素
planes:2字节,0x01=1,位数为1
bits:2字节,0x20=32,每个像素需要32位
compression:4字节,0表示不压缩
imagesize:4字节,0x400=1024字节,位图数据大小为1024字节
xresolution:4字节,水平分辨率
yresolution:4字节,垂直分辨率
ncolours:4字节,位图中使用的调色板颜色数量
importantcolours:4字节,重要的颜色编号[RAW DATA示例说明****]
刚才的File Header总共有14个字节,Info Header是40个字节,“imagesize”=1024字节,所以“14 + 40 + 1024=1078”,等于File中“size”的大小标头。下面我只摘取部分数据。无论如何,所有文件中,减去头文件的54字节,剩下的就是位图数据。
关于本次深入解析BMP文件格式:全面指南和的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
【深入解析BMP文件格式:全面指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直想学习一下怎么编辑 BMP 文件!这篇文章能给我一个好起点吗?
有17位网友表示赞同!
我听说 BMP 格式的文件体积比较大,这种设计有什么优缺点呢?
有18位网友表示赞同!
BMP 是哪些软件常用的格式?
有7位网友表示赞同!
我想知道 BMP 文件的安全性怎么样?
有17位网友表示赞同!
除了图片展示,还可以用 BMP 储存其他数据吗?
有15位网友表示赞同!
这篇文章会介绍 BMP 的历史发展吗?
有13位网友表示赞同!
什么时候 BMP 开始流行起来的呢?
有17位网友表示赞同!
BMP 在不同硬件平台上表现如何?
有19位网友表示赞同!
有什么软件可以专门用来编辑 BMP 文件吗?
有14位网友表示赞同!
学会使用 BMP 格式,对做网页设计有帮助吗?
有16位网友表示赞同!
在 Photoshop 中可以用哪些功能来处理 BMP 格式的图片?
有9位网友表示赞同!
最近看到很多开源图像库用 BMP 格式存储图像,这说明了什么?
有18位网友表示赞同!
BMP 文件如何与其他常见格式进行转换?
有18位网友表示赞同!
我发现有些 BMP 文件大小异常大,这是什么原因?
有8位网友表示赞同!
BMP 文件的文件头有什么作用?
有7位网友表示赞同!
BMP 格式的压缩机制有哪些?
有9位网友表示赞同!
用什么软件可以查看 BMP 文件的元数据信息?
有19位网友表示赞同!
为什么有些专业摄影师会选择保存图片为 BMP 格式?
有10位网友表示赞同!
学习 BMP 格式对提升图像处理能力有好处吗?
有10位网友表示赞同!