BMP文件格式详解(BMP file format)
BMP文件格式,又称为Bitmap(位图),或是DIB(Device-Independent Device,设备无关图),是windows系统中广泛使用的图片文件格式,由于它可以不作任何变换地址保存图像像素域的数据,因为称为我们取得RAW数据的重要来源。Windows的图像用户界面也在他的内建图像子系统GDI中对BMP格式提供了支持。
BMP文件的数据按照从文件头开始的先后顺序分为四部分:
- l bmp文件头:提供文件的格式、大小等信息
- l 位图信息头:提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
- l 调色板:可选,如使用索引来表示图像
- l 位图数据:图像数据
一般图像以24位图像为主,即R、G、B三种颜色各8bit来表示,这样的图像称之为真彩色,此时是不需要调色板的,也就是说位图信息头后紧跟着就是位图数据了。所以位图文件从文件头开始偏移54个字节就是位图数据了,这就是24位或者32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对于某些图文件没有用了。
byte – 8字节
word – 16字节
int/unit/dword – 32字节
文件头:
BMP的文件头共14个字节
|
字节顺序 |
数据结构 |
描述 |
|
1,2 |
word |
高8位位字母‘B,低8位为字母’M‘ |
|
3,4,5,6 |
unit |
文件尺寸 |
|
7,8 |
word |
保留字1 |
|
9,10 |
word |
保留字1 |
|
11,12,13,14 |
unit |
位图数据部分相对于文件的起始偏移量 |
数据部分偏移量的存在,说明图像数据部分并不一定要紧随图像参数或调色板之后放置,BMP图片的制作者其实可以在调色板之后、数据部分之前填充任何内容,只要正确地设置偏移量即可。
图像参数信息:
这一个数据块共40字节或56字节。前40字节的内容如下:
|
字节顺序 |
数据结构 |
描述 |
|
15,16,17,18 |
unit |
当前结构体的大小,通常是40或56 |
|
19,20,21,22 |
int |
图像宽度(像素) |
|
23,24,25,26 |
int |
图像高度(像素) |
|
27,28 |
word |
恒为1 |
|
29,30 |
word |
每个像素占用的位数即bpp |
|
31,32,33,34 |
unit |
压缩方式 |
|
35,36,37,38 |
unit |
图像的尺寸 |
|
39,40,41,42 |
int |
水平分辨率 |
|
43,44,45,46 |
int |
垂直分辨率 |
|
47,48,49,50 |
uint |
引用色彩数 |
|
51,52,53,54 |
uint |
关键色彩数 |
31-34字节表示图像数据的压缩方式,参数取值范围是0,1,2,3等
0 – RGB方式
1 – 8bpp的run-length-encoding方式
2 – 4bpp的run-length-encoding方式
3 – bit-fields方式
只有压缩方式选项被设置为bit-fileds时,当前结构体大小为56字节,否则,为40字节。
调色板
当bpp <= 8时,BMP使用调试版记录色彩信息,调色板每条数据(即每条色彩值)都是一个uint型数据。当调色板存在时,图像数据块中存储的只是各个像素的色彩在调色板中的索引值,必须通过在调色板中查表,才能获取各个像素的只是颜色。若引入调色板,则调色板数据块紧随在图像参数数据块之后。
bpp == 1 时,调色板合法索引值只有0和1.因此调色板块只有两个色彩值,分别表示索引值为0和1的色彩信息。
bpp == 4或 bpp == 8 时,合法索引值范围扩大为[0,15]和 [0,255]。但图像不一定使用到了全部16种或256种颜色。第47-50字节存储的uint型数据指出图像种实际应用的色彩书,也即调色板种的色彩值数目。当然他不应该超出调色板的合法索引值范围。
当bpp == 4 或bpp == 8时,可以采用Run-Length-Encoding方式压缩 图像的存储空间,即压缩方式选项的值为1或2,(当选项值为0时不压缩)。这种编码格式所要考虑的情况是,如4bpp或8bpp位图尺寸较大时,由于色彩总数是非常有限的,所以图像中必然会出现和诺颜色重复的像素,因此BMP图像格式的设计者决定采用一种简单的措施来挽回一些被浪费掉的存储空间,这个简单的措施就是RLE压缩方法。
RLE—Run-Length-Encoding
先用一个字节来存储重复色彩的数量,再用一个字节来存储这个色彩的值,即用来个字节代表一段重复的像素并且,他们给这段重复色彩的数量起了一个名字,叫做Run-Length。由于runleng为0时是没有意义,因此设计者把runleng=0作为每行的终止符。
如果一张位图中没有重复的像素,这种情况最好不要使用压缩算法。(红蓝像素点阵),如果既有重复像素,又有点阵的情况的时候,就需要修改runlength=0时候的意义了。
设计者规定,如果遇到runlength=0时继续读取下一个字节,如果该字节值为n,意味着后面n个像素将采用逐字翻译的方式来解析。也就是说n个像素前面没有runlength这个字节。
上诉方法导致了runlength==0的作为行终止符的含义修改了。但是runlength==0之后的nage 字节值为0,1,2时仍然没有意义,所以规定,当这个值为0时,表示行结束符;当这个值为1时,表示文件结束符;当这个值大于等于3时才逐字翻译。
RGB和Bit-Fields
当图像中引用的色彩数超过256时,我们就需要16bpp或更高的位图,调色板不适合bpp较大的位图,因此16bpp以上的位图不适合使用调色板。不使用调色板的位图图像有两种编码格式:RGB和Bit-Fileds
RGB编码是一种均分思想,使Red、Green、Blue三个颜色分包含的信息容量尽可能的一样大。
16bpp-RGB:在每个像素所占的16bits种,低5位表示Blue分量;中5位表示Green分量;高5位表示Red分量;最高意味无意义。所以从低到高的顺序实际上使B-G-R。
24bpp-RGB:24bpp的位图又称为真彩位图,它通常只有一种的编码格式,在24bits中,低8位表示Blue分量;中8位表示Green分量;高8位表示Red分量;
32bpp-RGB:在32bits中,低24位的编码方式与24bpp位图相同,最高八位用来表示Alpha分量。32bpp的位图尺寸太大,一般只有在图像处理的中间过程使用,对于需要半透过效果的图像,更好的选择使PNG格式。
BF编码格式与RGB不同,他利用位域操作,认为的确定RGB三分量所包含的信息容量。在图像参数信息模块的介绍中提及,当压缩方式选项设置位BF时,图像参数结构将比平时多16字节。这16字节实际上时4个dword的位域掩码。按照先后顺序,他们分别是R、G、B、A四个分量的位域掩码,如果没有Alpha分量,则Alpha掩码没有实际意义。
位域掩码的作用是:指出像素色彩中的RGB分量,就像子网掩码指出子网网段一样。
16-bpp-BF-565:这是BF编码格式最著名和最普遍的应用。他的Red、Green、Blue分量的位掩码分别是0xF800、0x07E0、0x001F。
图像数据块
图像数据块从头文件中起始偏移量字段所指出的位置开始,其中存放着位图图像的数据,数据格式由图像参数信息块中的压缩方式选项取值决定。操作图像数据块时,有一些注意事项:
当压缩方式为RGB时,图像数据块以“行”为单位双字对齐。
bpp<8时,每个字节将存放多个像素的色彩所以,则先出现的像素存放在高位。
BMP文件格式详解(BMP file format)的更多相关文章
- 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系统中广 ...
- 【转】bmp文件格式详解
先区分几个概念:16色和16位色一样吗? 不一样! 颜色位数,即是用多少位字节表示的值,每一位可以表示0和1两值.通常图片的颜色深度,简称色深,就是用位数来表示的,所以,我通常会看到8位色,16位色, ...
- BMP格式详解
BMP格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Win ...
- BMP结构详解
位图BITMAPINFOHEADER 与BITMAPFILEHEADER: 先来看BITMAPINFOHEADER,只写几个主要的biSize包含的是这个结构体的大小(包括颜色表) biWidt ...
- 音视频入门-11-PNG文件格式详解
* 音视频入门文章目录 * PNG 文件格式解析 PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDAT.IEND)组成. PNG 文件包括 8 字节 ...
- PE文件格式详解,第一讲,DOS头文件格式
PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- DOS文件转换成UNIX文件格式详解
转:DOS文件转换成UNIX文件格式详解 由windows平台迁移到unix系统下容易引发的问题:Linux执行脚本却提示No such file or directory dos格式文件传输到uni ...
随机推荐
- Docker/Dockerfile debug调试技巧
『重用』容器名 但我们在编写/调试Dockerfile的时候我们经常会重复之前的command,比如这种docker run --name jstorm-zookeeper zookeeper:3.4 ...
- InputStream和OutputStream及相关知识汇总
https://www.jianshu.com/p/e5bc7ea5f948 最近帮学姐写爬虫的时候遇到奇怪的问题,同样的程序在Mac上可以正常运行而在Windows上返回结果错误,最后经排查发现是L ...
- Java visualvm
简介 VisualVM是一个集成多个JDK命令行工具的可视化工具.可以作为Java应用程序性能分析和运行监控的工具.开发人员可以利用它来监控.分 析线程信息,浏览内存堆数据.系统管理员可以利用它来监测 ...
- CI隐藏入口文件index.php
1.需要apache打开rewrite_module,然后修改httpd.conf的AllowOverride none 为AllowOverride All(里面,不同的环境目录不同) 2.在CI的 ...
- EVM靶机渗透
前言 靶机下载地址: https://download.vulnhub.com/norzhctf/Basilic.ova 通过渗透靶机来学习相关知识以便提高在真实环境的渗透能力 ==. 安装: 我是用 ...
- SAP成都研究院的小伙伴们庆祝公司再次获得2019年最佳雇主的场景
日前,怡安集团旗下全球领先的人力资本管理咨询机构怡安翰威特与全球高管寻聘和领导力顾问公司史宾沙旗下Kincentric共同揭晓2019年中国最佳雇主榜单.SAP中国研究院凭借企业的创新文化和多元环境, ...
- Maven整合eclipse
1.配置eclipse本地Maven 点击Window-->Perference 选择Maven-->Installations 点击Add添加本地Maven 然后勾选本地Maven, ...
- Navicat链接数据库报错1130解决方案
1.背景 使用localhost 可以正常连接mysql服务器,但是使用ip地址连接保存如下: 2.问题原因 默认情况下root用户只允许本机访问,即使用localhost访问,如下图: 解决方案:将 ...
- Github 上 10 个值得学习的 Springboot 开源项目
Spring Boot 几乎继承了所有 Spring 框架的优点,同时还可以让项目的配置更简化.编码更简化.部署更方便.近两年受到很多开发者的追捧,也是火热的不行! 下面给大家整理了 10 个 Git ...
- 常见数据结构的 Python 实现(建议收藏)
数据结构作为计算机基础的必修内容,也是很多大型互联网企业面试的必考题.可想而知,它在计算机领域的重要性. 然而很多计算机专业的同学,都仅仅是了解数据结构的相关理论,却无法用代码实现各种数据结构. 今日 ...