BMP、JPEG文件格式详解
文章目录
- 六、BMP文件格式详解
- 1、BMP文件格式
- 2、BMP文件头
- 3、位图信息头
- 4、调色板
- 5、位图数据
- 6、对齐规则
- 七、JPEG文件结构分析
- 1、JPEG
- 2、SOI ( Start of Image )
- 2、APP0(Application 0)
- 3、DQT ( Define Quantization Table )
- 4、SOF0 (Start of Frame)
- 5、DHT ( Define Huffman Table )
- 6、SOS ( Start of Scan )
- 7、EOI ( End of Image )
六、BMP文件格式详解
1、BMP文件格式
BMP文件格式又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。
MP文件的数据按照从文件头开始的先后顺序分为四个部分:
**bmp文件头(bmp file header):**提供文件的格式、大小等信息
**位图信息头(bitmap information):**提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
**调色板(color palette):**可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
**位图数据(bitmap data):**就是图像数据啦_
- 我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是位图信息头后面紧跟的就是位图数据了。因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。
- 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。如数据0x1756在内存中的存储顺序为:
这种存储方式称为小端方式(little endian) , 与之相反的是大端方式(big endian)。
2、BMP文件头
- 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个字节。
3、位图信息头
- 同样地,Windows为位图信息头定义了如下结构体:
- 对照数据文件:
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,与前面得到的结论一致。
4、调色板
下面的数据就是调色板了。前面也已经提过,调色板其实是一张映射表,标识颜色索引号与其代表的颜色的对应关系。它在文件中的布局就像一个二维数组palette[N][4],其中N表示总的颜色索引数,每行的四个元素分别表示该索引对应的B、G、R和Alpha的值,每个分量占一个字节。如不设透明通道时,Alpha为0。因为前面知道,本图有256个颜色索引,因此N = 256。索引号就是所在行的行号,对应的颜色就是所在行的四个元素。这里截取一些数据来说明:
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个字节一致。
5、位图数据
下面就是位图数据了,每个像素占一个字节,取得这个字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上就可以了。
注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。
- 也即我们见到的第一个像素60是图像最左下角的数据,第二个人像素60为图像最后一行第二列的数据,一直到最后一行的最后一列数据,后面紧接的是倒数第二行的第一列的数据,依此类推。
- 如果图像是24位或是32位数据的位图的话,位图数据区就不是索引而是实际的像素值了。下面说明一下,此时位图数据区的每个像素的RGB颜色阵列排布:24位RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。
- 32位数据按照BGRA的顺序存储,其余与24位位图的方式一样,像素的排布规则与前述一致。
6、对齐规则
- 讲完了像素的排列规则以及各像素的颜色分量的排列规则,最后我们谈谈数据的对齐规则。我们知道Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话对于数据的获取速度等都是有很大的增益的。因此,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充(以0填充),这样可以达到按行的快速存取。这时,位图数据区的大小就未必是 图片宽×每像素字节数×图片高 能表示的了,因为每行可能还需要进行比特填充。
七、JPEG文件结构分析
1、JPEG
JPEG文件使用的数据存储方式有多种。最常用的格式称为JPEG文件交换格式(JPEG File Interchange Format,JFIF)。而JPEG文件大体上可以分成两个部分:标记码(Tag)和压缩数据。标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF可以被理解为一个0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。
常用的标记有
SOI
、APP0
、DQT
、SOF0
、DHT
、SOS
、EOI
。
2、SOI ( Start of Image )
- 图像开始
意义 | 大小 | 值 |
---|---|---|
标记代码 | 两字节 | 0xFFDB |
2、APP0(Application 0)
- 应用程序保留标记0
字段 | 意义 | 大小 | 值 |
---|---|---|---|
① | 标记代码 | 2字节 | 0xFFE0 |
② | 数据长度 | 2字节 | 字段的总长度(不包括标记字段) |
③ | 标识符 | 5字节 | 固定值0x4A46494600,即字符串“JFIF0” |
④ | 版本号 | 2字节 | 一般是0x0102,表示JFIF的版本号1.2 |
⑤ | X和Y的密度单位 | 1字节 | 0:无单位;1:点数/英寸;3:点数/厘米 |
⑥ | X方向像素密度 | 2字节 | 不确定 |
⑦ | Y方向像素密度 | 2字节 | 不确定 |
⑧ | 缩略图水平像素数目 | 1字节 | 不确定 |
⑨ | 缩略图垂直像素数目 | 1字节 | 不确定 |
⑩ | 缩略图RGB位图 | 不确定 | 缩略图RGB位图数据 |
- 本标记段可以包含图像的一个微缩版本,存为24位的RGB像素。如果没有微缩图像(这种情况更常见),则字段“缩略图水平像素数目”和字段“缩略图垂直像素数目”的值均为0。
3、DQT ( Define Quantization Table )
- 定义量化表
字段 | 意义 | 大小 | 值 |
---|---|---|---|
① | 标记代码 | 2字节 | 0xFFE0 |
② | 数据长度 | 2字节 | 字段②和多个字段③的总长度 |
③ | 量化表 | 数据长度-2字节 | 见下表 |
- 字段③的内容为:
意义 | 大小 | 值 |
---|---|---|
精度及量化表ID | 1字节 | 高4位:精度,0:8位;1:16位;低4位:量化表ID取值范围0~3 |
表项 | (64×(精度+1))字节 | 例如8位量化表其表项长度为64×(0+1)=64字节 |
- 本标记段中,字段②中包含的内容可以循环出现,表示多个量化表,但最多只能出现4次。
4、SOF0 (Start of Frame)
- 帧图像开始
字段 | 意义 | 大小 | 值 |
---|---|---|---|
① | 标记代码 | 2字节 | 0xFFC0 |
② | 数据长度 | 2字节 | ①~⑥ 字段的总长度 |
③ | 精度 | 1字节 | 每个数据样本的位数。通常是8位,一般软件都不支持12位和16位 |
④ | 图像高度 | 2字节 | 图像高度(单位:像素) |
⑤ | 图像宽度 | 2字节 | 图像宽度(单位:像素) |
⑥ | 颜色分量数 | 1字节 | 1:灰度图;3:YCrCb;4:CMYK。JFIF中使用YCrCb,故这里恒为3 |
⑦ | 颜色分量信息 | 颜色分量数×3字节(通常为9字节) | 见下表 |
- 字段⑦中包含这些字段:
意义 | 大小 | 值 |
---|---|---|
颜色分量ID | 1字节 | |
水平、垂直采样因子 | 1字节 | 高4位:水平采样因子。低4位:垂直采样因子 |
量化表ID | 1字节 | 当前分量使用的量化表ID |
- 字段⑦中的内容会重复出现,有多少个颜色分量(字段⑥)就出现多少次(一般为3次)。
5、DHT ( Define Huffman Table )
- 定义哈夫曼表
字段 | 意义 | 大小 | 值 |
---|---|---|---|
① | 标记代码 | 2字节 | 0xFFC4 |
② | 数据长度 | 2字节 | 字段②和字段③的总长度 |
③ | 哈夫曼表 | 数据长度-2字节 | 见下表 |
- 字段③包含下列字段:
意义 | 大小 | 值 |
---|---|---|
表ID和表类型 | 1字节 | 高4位:类型,0:DC直流,1:AC交流。低四位,哈夫曼表ID,注意,DC和AC分开编ID |
不同位数的码字数量 | 16字节 | 如第1个字节为0x02代表长度为1的码字有2个 |
编码内容 | 16个不同位数的码字数量之和(字节) |
- 此标记段中,字段③中的内容可以循环出现(一般为4次),也可以出现4次。
6、SOS ( Start of Scan )
- 扫描开始
字段 | 意义 | 大小 | 值 |
---|---|---|---|
① | 标记代码 | 2字节 | 0xFFDA |
② | 数据长度 | 2字节 | ②~⑤ 字段的总长度 |
③ | 颜色分量数 | 1字节 | 应该和SOF中的字段⑤的值相同 |
④ | 颜色分量信息 | 2字节 | 见下表a |
⑤ | 压缩数据图像数据 | 3字节 | 见下表b |
- 表a:
意义 | 大小 | 值 |
---|---|---|
颜色分量ID | 1字节 | |
直流、交流系数表号 | 1字节 | 高4位:直流分量使用的哈夫曼编码树编号;低4位:交流分量使用的哈夫曼树编号 |
- 表b:
意义 | 大小 | 值 |
---|---|---|
谱选择开始 | 1字节 | 固定值0x00 |
谱选择结束 | 1字节 | 固定值0x3F |
谱选择 | 1字节 | 在基本JPEG中总为0x00 |
- 本标记段中,字段④应该重复出现,有多少个颜色分量,就出现多少次(一般为3次)。本段结束后就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以
EOI
标记表示结束。
7、EOI ( End of Image )
- 图像结束
意义 | 大小 | 值 |
---|---|---|
标记代码 | 2字节 | 0xFFD9 |
- 由于在JPEG文件中0xFF具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xFF,就需要作特别处理。具体方法是,在数据0xFF后添加一个没有意义的0x00。所以在读取图像信息时如果遇到0xFF00其实际意义为0xFF。
BMP、JPEG文件格式详解相关推荐
- 音视频入门-11-PNG文件格式详解
音视频入门文章目录 PNG 文件格式解析 PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDAT.IEND)组成. PNG 文件包括 8 字节文件署名 ...
- MP4文件格式详解——文件类型ftyp
原谅地址:http://blog.csdn.net/pirateleo/article/details/7583321 文件类型ftyp(ISO-14496-12) Author:Pirate Leo ...
- MP4文件格式详解——文件类型ftyp(转)
文件类型ftyp(ISO-14496-12) Author:Pirate Leo Email:codeevoship@gmail.com ISO 14496 - 12 定义了一种封装媒体数据的基础文件 ...
- 多媒体 MP4文件格式详解——文件类型ftyp
ISO 14496 - 12 定义了一种封装媒体数据的基础文件格式,mp4.3gp.ismv等我们常见媒体封装格式都是以这种基础文件格式为基础衍生的. 如果从全局角度了解基础文件格式,请看我之前的博文 ...
- Ffmpeg快速命令使用 Ffmpeg选项详解 Ffmepg格式详解 常见视频文件格式详解
http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5 Ffmpeg快速命令使用 From Ffmpeg工程组 Jump to: navigatio ...
- S19文件格式详解(总结)以及与hex文件的互转
S19文件格式详解 S-record格式文件是Freescale CodeWarrior编译器生成的后缀名为.S19的程序文件,是一段直接烧写进MCU的ASCII码,英文全称问Motoro ...
- MP4文件格式详解——结构概述
MP4文件格式详解(ISO-14496-12/14) 一.基本概念 1. 文件,由许多Box和FullBox组成. 2. Box,每个Box由Header和Data组成. 3. FullBox,是Bo ...
- S19文件格式详解(1)
1.记录结构 0 1 2 3 4 5 S Type Byte Count Address Data Checksum 一个SREC格式文件包含一系列ASCLL格式的的数据.具体如下: Record t ...
- ZIP文件格式详解(一)——文件数据格式
ZIP文件格式详解(一)--文件数据格式 ------------------------------------------------------------------------------- ...
- MP4文件格式详解——元数据moov(二)tkhd box
ISO 14496 - 12 定义了一种封装媒体数据的基础文件格式,mp4.3gp.ismv等我们常见媒体封装格式都是以这种基础文件格式为基础衍生的. 如果从全局角度了解基础文件格式,请看我之前的博文 ...
最新文章
- 科技公司重新关注2级以上驾驶员辅助
- 第18章:MYSQL分区
- 软件工程 团队博客分数 (第一阶段)
- pythonfopen_Python之文件读写详解
- phpstorm设置方法头信息备注
- Linux命令解释之vim
- oracle视图建主键
- Spark:Spark 编程模型及快速入门
- [Search Engine] 搜索引擎技术之查询处理
- 开源 syslog 日志系统 scribe
- 金税盘时钟异常的处理方法及处理流程
- 搞定Prometheus普罗米修斯监控系统
- ygo游戏王卡组_游戏王ygocore
- 当你一个人扛下所有,你就懂了
- C++ 智能指针我得用用看
- sql server数据库练习
- HDU 6617 Enveloping Convex(凸包+半平面交+二分)
- 药店管理系统源码 药店管理信息系统源码带文档
- C#编程学习49:将数据写入到excel中
- 布局Mac,QQ浏览器全面出击
热门文章
- Android 手把手教你实现百度身份证识别
- Python计算时间差天数
- 合肥工业大学计算机信息检索报告,合肥工业大学计算机信息检索(图书馆资源利用)作业.doc...
- 一看就懂的保姆级教程:open vn设置 (亲测通过)
- 在Mac上安装和配置Tunnelblick工具
- 网易mysql微专业_网易MySQL数据库工程师微专业学习笔记(一)
- android重建模拟器,Android建立模拟器进行调试
- c语言编程培训都是小学,小学编程培训班明故宫哪里有C语言培训
- 硬件设计与开发——如何提高自己的能力
- 写一个搜索引擎系统(Java版)