音视频入门-14-JPEG文件格式详解
JPEG 文件格式解析
JPEG 文件使用的数据存储方式有多种。最常用的格式称为 JPEG 文件交换格式(JPEG File Interchange Format,JFIF)。而 JPEG 文件大体上可以分成两个部分:标记码(Tag)和压缩数据。
标记码由两个字节构成,其前一个字节是固定值 0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的 0xFF 填充,也就说连续的多个 0xFF可以被理解为一个 0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。
常用的标记有 SOI、APP0、APPn、DQT、SOF0、DHT、DRI、SOS、EOI。
注意,SOI 等都是标记的名称。在文件中,标记码是以标记代码形式出现。例如 SOI 的标记代码为 0xFFD8,即在 JPEG 文件中的如果出现数据 0xFFD8,则表示此处为一个 SOI 标记。
| 标记 | 标记代码 | 描述 |
|---|---|---|
| SOI | 0xD8 | 图像开始 |
| APP0 | 0xE0 | JFIF应用数据块 |
| APPn | 0xE1 - 0xEF | 其他的应用数据块(n, 1~15) |
| DQT | 0xDB | 量化表 |
| SOF0 | 0xC0 | 帧开始 |
| DHT | 0xC4 | 霍夫曼(Huffman)表 |
| DRI | 0xDD | 差分编码累计复位的间隔 |
| SOS | 0xDA | 扫描线开始 |
| EOI | 0xD9 | 图像结束 |
用来分析的样例图片:libpng-rgb-rainbow.jpg。
(1) SOI (Start of Image)图像开始标记
0xFFD8

(2) APP0 (Application) 应用程序保留标记0
0xFFE0
包含9个具体字段:
| 序号 | 名称 | 长度 | 描述 |
|---|---|---|---|
| ① | 数据长度 | 2 字节 | ①~⑨ 9个字段的总长度,即不包括标记代码,但包括本字段 |
| ② | 标识符 | 5 字节 | 固定值 0x4A46494600,即字符串“JFIF0” |
| ③ | 版本号 | 2 字节 | 一般是 0x0102,表示 JFIF 的版本号 1.2,可能会有其他数值代表其他版本 |
| ④ | X 和 Y 的密度单位 | 1 字节 | 只有三个值可选 0:无单位;1:点数/英寸;2:点数/厘米 |
| ⑤ | X 方向像素密度 | 2 字节 | 取值范围未知 |
| ⑥ | Y 方向像素密度 | 2 字节 | 取值范围未知 |
| ⑦ | 缩略图水平像素数目 | 1 字节 | 取值范围未知 |
| ⑧ | 缩略图垂直像素数目 | 1 字节 | 取值范围未知 |
| ⑨ | 缩略图 RGB 位图 | 长度可能是 3 的倍数 | 缩略图 RGB 位图数据 |
本标记段可以包含图像的一个微缩版本,存为 24 位的 RGB 像素。如果没有微缩图像(这种情况更常见),则字段 ⑦“ 缩略图水平像素数目”和字段 ⑧“ 缩略图垂直像素数目”的值均为 0 。

(3) APPn (Application) 应用程序保留标记 n,其中 n=1~15(任选)
0xFFE1~0xFFF
包含 2 个具体字段:
| 序号 | 名称 | 长度 | 描述 |
|---|---|---|---|
| ① | 数据长度 | 2 字节 | ①~② 2 个字段的总长度,即不包括标记代码,但包括本字段 |
| ② | 详细信息 | 数据长度-2 字节 | 内容不定 |
例如,Adobe Photoshop 生成的 JPEG 图像中就用了 APP1 和 APP13 两个标记段分别存储了一幅图像的副本。

(4) DQT (Define Quantization Table) 定义量化表
0xFFDB
包含 2 个具体字段:
| 序号 | 名称 | 长度 | 描述 |
|---|---|---|---|
| ① | 数据长度 | 2 字节 | 字段 ① 和多个字段 ② 的总长度 ,即不包括标记代码,但包括本字段 |
| ② | 量化表 | 数据长度-2 字节 | 《量化表表格》 |
量化表表格:
| 名称 | 长度 | 描述 |
|---|---|---|
| 精度及量化表 ID | 1 字节 | 高 4 位:精度,只有两个可选值 0:8位;1:16位; 低 4 位:量化表 ID,取值范围为 0~3 |
| 表项 | (64×(精度+1)) 字节 | 例如 8 位精度的量化表,其表项长度为 64×(0+1)=64 字节 |
本标记段中,字段 ② 可以重复出现,表示多个量化表,但最多只能出现 4 次。

(5) SOF0 (Start of Frame) 帧图像开始
0xFFC0
包含 6 个具体字段:
| 序号 | 名称 | 长度 | 描述 |
|---|---|---|---|
| ① | 数据长度 | 2 字节 | ①~⑥ 六个字段的总长度,即不包括标记代码,但包括本字段 |
| ② | 精度 | 1 字节 | 每个数据样本的位数,通常是 8 位,一般软件都不支持 12 位和 16 位 |
| ③ | 图像高度 | 2 字节 | 图像高度(单位:像素),如果不支持 DNL 就必须 > 0 |
| ④ | 图像宽度 | 2 字节 | 图像宽度(单位:像素),如果不支持 DNL 就必须 > 0 |
| ⑤ | 颜色分量数 | 1 字节 | 只有 3 个数值可选 1:灰度图;3:YCrCb 或 YIQ;4:CMYK; 而 JFIF 中使用 YCrCb,故这里颜色分量数恒为 3 |
| ⑥ | 颜色分量信息 | 颜色分量数×3字节(通常为 9 字节) | 《颜色分量信息表格》 |
颜色分量信息:
| 名称 | 长度 | 描述 |
|---|---|---|
| 颜色分量 ID | 1 字节 | |
| 水平/垂直采样因子 | 1 字节 | 高 4 位:水平采样因子,低 4 位:垂直采样因子 |
| 量化表 | 1 字节 | 当前分量使用的量化表的 ID |
本标记段中,字段 ⑥ 应该重复出现,有多少个颜色分量(字段 ⑤),就出现多少次(一般为 3 次)。

(6) DHT (Define Huffman Table) 定义哈夫曼表
0xFFC4
包含 2 个具体字段:
| 序号 | 名称 | 长度 | 描述 |
|---|---|---|---|
| ① | 数据长度 | 2 字节 | 字段 ① 和多个字段 ② 的总长度,即不包括标记代码,但包括本字段 |
| ② | 哈夫曼表 | 数据长度-2 字节 | 《哈夫曼表表格》 |
哈夫曼表表格:
| 名称 | 长度 | 描述 |
|---|---|---|
| 表 ID 和表类型 | 1 字节 | 高 4 位:类型,只有两个值可选 0:DC 直流;1:AC 交流; 低 4 位:哈夫曼表 ID,注意,DC 表和 AC 表分开编码 |
| 不同位数的码字数量 | 16 字节 | 编码内容 16 个不同位数的码字数量之和(字节) |
本标记段中,字段 ② 可以重复出现(一般 4 次),也可以只出现1次。例如,Adobe Photoshop 生成的 JPEG 图片文件中只有 1 个 DHT 标记段,里边包含了 4 个哈夫曼表;而 Macromedia Fireworks 生成的 JPEG 图片文件则有 4 个 DHT 标记段,每个 DHT 标记段只有一个哈夫曼表。

(7) DRI (Define Restart Interval) 定义差分编码累计复位的间隔
0xFFDD
包含 2 个具体字段:
| 序号 | 名称 | 长度 | 描述 |
|---|---|---|---|
| ① | 数据长度 | 2 字节 | 固定值 0x0004,①~② 两个字段的总长度,即不包括标记代码,但包括本字段 |
| ② | MCU 块的单元中的重新开始间隔 | 2字节 | 设其值为 n,则表示每 n 个 MCU 块就有一个 RSTn 标记。第一个标记是 RST0,第二个是 RST1 等,RST7 后再从 RST0 重复。 |
如果没有本标记段,或间隔值为 0 时,就表示不存在重开始间隔和标记 RST。

(8) SOS (Start of Scan) 扫描开始 12字节
0xFFDA
包含 4 个具体字段:
| 序号 | 名称 | 长度 | 描述 |
|---|---|---|---|
| ① | 数据长度 | 2 字节 | ①~④ 两个字段的总长度,即不包括标记代码,但包括本字段 |
| ② | 颜色分量数 | 1 字节 | 应该和 SOF 中的字段 ⑤ 的值相同,即: 1:灰度图是;3: YCrCb 或 YIQ;4:CMYK。 而 JFIF 中使用 YCrCb,故这里颜色分量数恒为 3 |
| ③ | 颜色分量信息 | (a) 颜色分量 ID: 1 字节 (b) 直流/交流系数表号: 1 字节 (高 4 位:直流分量使用的哈夫曼树编号,低 4 位:交流分量使用的哈夫曼树编号) |
|
| ④ | 压缩图像数据 | (a) 谱选择开始:1 字节(固定值 0x00) (b) 谱选择结束:1 字节(固定值 0x3F) (c) 谱选择:1 字节(在基本 JPEG 中总为 0x00) |
本标记段中,字段 ③ 应该重复出现,有多少个颜色分量(字段 ②),就出现多少次(一般为 3 次)。本段结束后,紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以 EOI 标记表示结束。

(9) EOI (End of Image) 图像结束标记
0xFFD9

JPEG 标记总览

More
下一步,将用代码手动生成一张 JPEG 图片,文章目录:* 音视频入门文章目录 *。
参考资料:
内容有误?联系作者:

本文由博客一文多发平台 OpenWrite 发布!
音视频入门-14-JPEG文件格式详解的更多相关文章
- 【转】jpeg文件格式详解
JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写.它由国际电话与电报咨询委员会CCITT(The International Telegraph ...
- 音视频入门-11-PNG文件格式详解
* 音视频入门文章目录 * PNG 文件格式解析 PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDAT.IEND)组成. PNG 文件包括 8 字节 ...
- 音视频入门-12-手动生成一张PNG图片
* 音视频入门文章目录 * 预热 上一篇 [PNG文件格式详解]详细介绍了 PNG 文件的格式. PNG 图像格式文件由一个 8 字节的 PNG 文件署名域和 3 个以上的后续数据块(IHDR.IDA ...
- 音视频入门-13-使用开源库生成PNG图片
* 音视频入门文章目录 * RGB-to-PNG 回顾 上一篇 [手动生成一张PNG图片] 根据 [PNG文件格式详解] 一步一步地手动实现了将 RGB 数据生成了一张 PNG 图片. 有许多开源的 ...
- 音视频入门-18-手动生成一张GIF图片
* 音视频入门文章目录 * GIF 编码知识 GIF 包含的数据块: 文件头(Header) 逻辑屏幕标识符(Logical Screen Descriptor) 全局颜色表(Global Color ...
- 音视频入门-03-RGB转成BMP图片
* 音视频入门文章目录 * BMP 文件格式解析 BMP 文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 位图文件头(14个字节) 位图信息头(40个字节) 颜色信息 图形数据 文件头与信息 ...
- 音视频入门-02-RGB拼图
* 音视频入门文章目录 * 图片 & 像素点 & RGB 平时浏览的图片看不出像素点: 图片放大时,可以看出图片是一个个像素点组成的: 每个像素点的颜色可以用 RGB 表示: RGB ...
- 堪称教科书级别的Android音视频入门进阶学习手册,开源分享!
概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...
- BMP文件格式详解
BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广 ...
随机推荐
- day3------基本数据类型int, bool, str,list,tuple,dict
基本数据类型(int, bool, str,list,tuple,dict) 一.python基本数据类型 1. int 整数. 主要用来进行数学运算 2. str 字符串, 可以保存少量数据并进 ...
- AQL基本语法
目录: 基本的CRUD 插入 检索 更新 删除 匹配文件 排序和限制 限制 排序 组合 图操作 地理位置查询 一.数据预览 本次使用的数据共有43条,每条数据包含姓氏.年龄.活动状态和特征等六个字段 ...
- (IDEA) 搭建Maven并使用Maven打包部署
1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME的环境变量,然后将该变量添加到Path中 备注:必须要有JAVA_HOM ...
- 盘点一下Creator星球上的开源工具包!
晓衡开始写公众号,最早是从上架 Cocos 商店的 pbkiller 插件开始的,到至今有2年2个月了.在这期间,又陆续在公众号上分享了多个实用工具包,在这里统一盘点一下,方便与大家交流学习. 一.u ...
- 零基础攻略!如何使用kubectl和HPA扩展Kubernetes应用程序
现如今,Kubernetes已经完全改变了软件开发方式.Kubernetes作为一个管理容器化工作负载及服务的开源平台,其拥有可移植.可扩展的特性,并促进了声明式配置和自动化,同时它还证明了自己是管理 ...
- Java设计模式:23种设计模式
1. 软件设计模式概述 2. GoF 的 23 种设计模式的分类和功能 3. UML中的类图及类图之间的关系 4. 开闭原则——面向对象设计原则 5. 里氏替换原则——面向对象设计原则 6. 依赖倒置 ...
- [2018-01-13] 安装Django的一些笔记
安装django pip install Django = =1.10.2 下载源码,进入根目录执行 python setup.py install 确认是否已经安装成功 python -m djan ...
- 树上神奇 逆 逆序对(我的叫法)hh的小纸条 重中之重!!!!!
HH是一位十分爱好数学的大佬,尤其喜爱数数,一天百无聊赖的他写下了一个1-N的排列,并且在小纸条上记下了每个数前面有多少个数比他小,但HH不小心忘记了这个排列.现在只有当时记下的小纸条,现在请你还原出 ...
- Kubernetes4-web管理界面
一.简介 1.环境 环境还是前面的环境 2.Kubernetes Dashboard web界面 kubernetes dashboard (仪表盘)是一个将通用的基于web的监控和操作界面加入kub ...
- 当 Redis 发生高延迟时,到底发生了什么
Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是 Redis 也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解 ...