BMP文件格式

BMP 文件结构介绍 在 BMP 文件格式中,每个字节和位都有特定的含义。BMP 文件格式是一种位图图像文件格式,用于存储数字图像,尤其是在 Windows 操作系统中。 阅读详情

转自:http://www.cnblogs.com/xiehy/archive/2011/06/07/2074405.html

BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。

下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

Ø         bmp文件头(bmp file header):提供文件的格式、大小等信息

Ø         位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息

Ø         调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表

Ø         位图数据(bitmap data):就是图像数据啦^_^

下面结合Windows结构体的定义,通过一个表来分析这四个部分。

我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。

  下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据段的排布以及组成。

 我们使用的图像显示如下:

                 

   这是一幅16位的位图文件,因此它是含有调色板的。

   在拉出图像数据进行分析之前,我们首先进行几个约定:

   1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。如数据0x1756在内存中的存储顺序为:

     

                                  

这种存储方式称为小端方式(little endian) , 与之相反的是大端方式(big endian)。对两者的使用情况有兴趣的可以深究一下,其中还是有学问的。

2.  以下所有分析均以字节为序号单位进行。

   下面我们对从文件中拉出来的数据进行剖析:

   

一、bmp文件头
Windows为bmp文件头定义了如下结构体:

  

typedef  struct tagBITMAPFILEHEADER 
{  
UINT16 bfType;    
DWORD bfSize; 
UINT16 bfReserved1; 
UINT16 bfReserved2; 
DWORD bfOffBits;
} BITMAPFILEHEADER; 

 

其中:

   

 对照文件数据我们看到:

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个字节。

二、位图信息头
同样地,Windows为位图信息头定义了如下结构体:

  

代码
typedef  struct tagBITMAPINFOHEADER
 {
DWORD biSize; 
LONG biWidth; 
LONG biHeight; 
WORD biPlanes; 
WORD biBitCount; 
DWORD biCompression; 
DWORD biSizeImage; 
LONG biXPelsPerMeter; 
LONG biYPelsPerMeter; 
DWORD biClrUsed; 
DWORD biClrImportant;
} BITMAPINFOHEADER;
 

 

对照数据文件: 

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,与前面得到的结论一致。

 

三、调色板
下面的数据就是调色板了。前面也已经提过,调色板其实是一张映射表,标识颜色索引号与其代表的颜色的对应关系。它在文件中的布局就像一个二维数组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个字节一致!

四、位图数据

下面就是位图数据了,每个像素占一个字节,取得这个字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上就可以了。

注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。

        

也即我们见到的第一个像素60是图像最左下角的数据,第二个人像素60为图像最后一行第二列的数据,…一直到最后一行的最后一列数据,后面紧接的是倒数第二行的第一列的数据,依此类推。

 如果图像是24位或是32位数据的位图的话,位图数据区就不是索引而是实际的像素值了。下面说明一下,此时位图数据区的每个像素的RGB颜色阵列排布:

24位RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。

32位数据按照BGRA的顺序存储,其余与24位位图的方式一样。

像素的排布规则与前述一致。

对齐规则

讲完了像素的排列规则以及各像素的颜色分量的排列规则,最后我们谈谈数据的对齐规则。我们知道Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话对于数据的获取速度等都是有很大的增益的。因此,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充(以0填充),这样可以达到按行的快速存取。这时,位图数据区的大小就未必是 图片宽×每像素字节数×图片高 能表示的了,因为每行可能还需要进行比特填充。

填充后的每行的字节数为:

     ,其中BPP(Bits Per Pixel)为每像素的比特数。

在程序中,我们可以表示为:

int iLineByteCnt = (((m_iImageWidth * m_iBitsPerPixel) + 31) >> 5) << 2;

这样,位图数据区的大小为:

  m_iImageDataSize = iLineByteCnt * m_iImageHeight;

我们在扫描完一行数据后,也可能接下来的数据并不是下一行的数据,可能需要跳过一段填充数据:

 skip = 4 - ((m_iImageWidth * m_iBitsPerPixel)>>3) & 3;

五、拾遗

至此,我们通过分析一个具体的位图文件例子详细地剖析了位图文件的组成。需要注意的是:我们讲的主要是PC机上的位图文件的构成,对于嵌入式平台,可能在调色板数据段与PC机的不同。如在嵌入式平台上常见的16位r5g6b5位图实际上采用的掩模的方式而不是索引的方式来表示图像。此时,在调色板数据段共有四个部分,每个部分为四个字节,实际表示的是彩色版规范。即:

 第一个部分是红色分量的掩模

 第二个部分是绿色分量的掩模

 第三个部分是蓝色分量的掩模

 第四个部分是Alpha分量的掩模(缺省为0)

典型的调色板规范在文件中的顺序为为:

 00F8 0000 E007 0000 1F00 0000 0000 0000

其中

    00F8 0000为FB00h=1111100000000000(二进制),是蓝红分量的掩码。 
  E007 0000为 07E0h=0000011111100000(二进制),是绿色分量的掩码。 
   1F00 0000为001Fh=0000000000011111(二进制),是蓝色分量的掩码。 
    0000 0000设置为0。

将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就可以明白事实上在每个像素值的两个字节16位中,按从高到低取5、6、5位分别就是r、g、b分量值。取出分量值后把r、g、b值分别乘以8、4、8就可以补齐每个分量为一个字节,再把这三个字节按BGR组合,放入存储器,就可以转换为24位标准BMP格式了。

这样我们假设在位图数据区有一个像素的数据在文件中表示为02 F1。这个数据实际上应为F102:

 r = (F102 AND F800) >> 8 = F0h = 240

 g= (F102 AND 07E0)>> 3 = 20h = 32 
  b=(F102 AND 001F) << 3 = 10h =16

至此我们就可以显示了。(本文结束)

参考资源:

1.      wiki百科 bmp file format  

http://en.wikipedia.org/wiki/BMP_file_format

2.      gwwgle的专栏 BMP格式详解 http://blog.youkuaiyun.com/gwwgle/archive/2009/11/06/4775396.aspx

3.      匿名 BMP格式图像文件详析http://www.thethirdmedia.com/pc/200407/20040722117029.shtm

4.      Singler的专栏位图文件(BMP)格式分析以及程序实现http://blog.youkuaiyun.com/yyfzy/archive/2006/06/10/785945.aspx

图像处理学习笔记——BMP图片详解 一、位图和调色板的概念 1.位图(Bitmap): 例如我们常说的屏幕分辨率为 640*480,刷新频率为70Hz,意思是说每行要扫描 640 个象素,一共有 480 行,每秒重复扫描屏幕 70 次。我们称这种显示器为位映象设备。所谓位映象,就是指一个二维的象素矩阵,而位图就是采用位映象方法显示和存储的图象。 2.彩色图: 当一幅图中每个象素赋予不同的 RGB 值时,就能呈现出五彩缤纷的颜色了,这样就形成了彩色图。 下表是常见的一些颜色的 RGB 组合值。 颜色 R G B 红 255 0 阅读详情

相关推荐

BMP文件格式详解

BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphical user interfaces

红魔&皮卡丘 8万+

Bmp图片格式介绍

BMP是英文)的简写,它是中的标准,能够被多种Windows所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱来的缺点–占用磁盘空间过大。

南大侠的博客 8755

BMP文件格式详解(BMP file format)

非常详细的BMP文件说明。 Bitmap是计算机最原始的位图文件,其它图片都是经过此格式压缩而成的。

BMP文件格式详解(BMP file format) (转)

转自:http://www.cnblogs.com/Jason_Yao/archive/2009/12/02/1615295.html BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要...

weixin_30551963的博客 782

Fluent温度超限调试:从能量方程到网格优化的实战指南

本文深入解析Fluent中温度超限问题的诊断与解决方法,从能量方程机制到网格优化策略,提供实战指南。通过分析温度与焓的换算关系,探讨典型场景如能量方程发散、局部网格质量差等,并给出五步调试法及高级命令应用,帮助工程师有效解决温度计算异常问题。

weixin_29045585的博客 530

Quartus Prime 软件 USB-blaster 驱动安装失败【已解决】

一、安装步骤 1、将FPGA 开发板插入电脑时,未安装驱动的电脑会提示安装usb-Blaster驱动。Windows搜索框打开设备管理器,在“其他设备”下会发现黄色感叹号的“USB-Blaster”的设备驱动。 2、Quartus系列软件的安装目录下自带USB-blaster的驱动程序,右键更新驱动,选择驱动目录:(D:\intelFPGA\18.1\quartus\drivers\usb-blaster,文件位置和版本请按照自己安装的路径选择),点击Next开始安装。 3、安装成功,重启电脑即可使

adolphwang_909086的博客 6万+

BMP文件格式解析

BMP文件格式解析 作者:水木子 一、图像概述 1.1 位图 位图(Bitmap),又称栅格图(英语:Raster graphics)或点阵图,是使用像素阵列来表示的图像。 ----维...

水木子的博客 8148

一窥Memory测试算法及自我修复机制

摘要 为了满足新一代设备的需求,Memory的大小每三年就会增加4倍。深亚微米设备包含大量面积更小、访问速度更快的Memory。针对此类设计制定自动测试策略可以减少ATE(自动测试设备)的时间和成本。 内存故障的行为与经典的“Stuck-At”故障不同。因此,Memory的故障模型(由于其阵列结构)与标准逻辑的设计也是不同的。Memory测试除了进行故障检测和定位,还可以实现用冗余单元对...

路科验证 2万+

BMP文件格式分析

本来不想写这篇东西,因为介绍BMP文件结构的资料太多了,都有些滥了。但刚写完BMP的读写模块,又不想不留下点什么,所以就写了,全当是学习笔记吧。自己以后查资料时也方便一些,也许对某些初哥还会有点用^_^注:本文参考了林福宗老师的有关BMP文件格式的文章,在此声明。简介BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP

智慧的鱼 3643

从零构建:如何用MATLAB工具箱打造你的第一个多体动力学仿真模型

本文详细介绍了如何使用MATLAB的Simscape Multibody工具箱从零开始构建多体动力学仿真模型,特别适合初学者学习倒立摆系统的建模与仿真。文章涵盖环境准备、坐标系设置、物理模型构建、参数化建模及性能优化等关键步骤,帮助工程师快速掌握这一强大的仿真工具。

water的专栏 964

从华为杯建模到论文录用:我的Biomedical Signal Processing and Control投稿全记录(含Latex模板与审稿人推荐技巧)

本文详细记录了作者从华为杯数学建模竞赛到Biomedical Signal Processing and Control期刊投稿的全过程,分享了如何将竞赛成果转化为学术论文的实用技巧,包括LaTeX排版中的常见陷阱与解决方案,以及审稿人推荐策略。特别提供了针对Elsevier模板的优化建议和高效回复审稿意见的方法,适合生物医学信号处理领域的研究者参考。

weixin_42549037的博客 452

BMP文件格式及数据提取

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

ts_54eagle的专栏 6107

2025.06.18【转录组】|Ribo-seq/small RNA数据分析:rRNA和smRNA比对率统计全流程

本文介绍了一种自动化统计rRNA/smRNA比对率的方法,用于评估Ribo-seq或small RNA测序数据的质量。主要内容包括:分析原理(比对率定义、参考序列来源)、实践流程(构建索引、比对统计)以及结果可视化方法。通过Python和R脚本实现自动化处理,可生成汇总表格和柱状图。比对率结果能反映样品污染程度,建议控制在20%以下。该流程有助于快速评估测序质量,为后续分析提供可靠依据。文中还提供了常见问题解决方案和脚本示例,适用于生物信息学标准化质控环节。

1615

bmp文件格式分析

  下面来分析bmp文件的格式。   我这里用的是8位256色的灰度图像。其他位深的图像在最后在做介绍。   首先也是点开属性得到下面信息:   图像是20像素宽40像素高的8位灰度图像,大小为1878字节。其中像素占20*40=800byte,文件结构头占1078字节,其实灰度图像的头结构都是占1078字节的。这1078个字节其实又分为两个部分最开头的54个字节是真正的头信息,余下...

weixin_34106122的博客 1278

把 SAP 输出稳稳落到 PDF:从 SPAD 前端打印到 ABAP 程序级转换的一套方法

摘要:本文介绍了三种在SAP系统中将报表输出转为PDF文件的方法。路线A通过SPAD配置前端输出设备,结合Windows打印机设置实现用户交互式PDF保存;路线B在SP01事务码中将已有Spool请求另存为PDF,适用于补救导出;路线C通过ABAP程序自动转换Spool为PDF,适合批量处理。文章详细说明了配置步骤,并针对常见问题(如乱码、文件格式错误等)提供了排查思路。三种方案分别适用于不同场景,用户可根据实际需求选择最合适的PDF导出方式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 219

扣子Coze智能体万字教程:从入门到精通,一文掌握AI工作流搭建

智能体 = 角色设定 + 提示词 + 变量输入一个好提示词的核心是结构、风格和复用性创建后可以一键发布成网页应用、对话助手整个过程0代码,只靠配置,人人可学,人人可用四、进阶一:理解「工作流」的威力如果你已经用扣子创建了几个简单的智能体,比如写个爆款小红书文案、生成一段短视频脚本,那恭喜你已经入门。但如果你还停留在“一个智能体 = 一段提示词”的层级,你离真正的智能体生产力革命,还差一步:学会搭建“工作流”——让多个大模型自动协同完成任务。

互联网架构师笔记 3494
上一篇: uItron内核原理和服务调用--Kernel篇
ecjtuync
博客等级 码龄20年 157粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值