音视频入门-14-JPEG文件格式详解

* 音视频入门文章目录 *

JPEG 文件格式解析

JPEG 文件使用的数据存储方式有多种。最常用的格式称为 JPEG 文件交换格式(JPEG File Interchange Format,JFIF)。而 JPEG 文件大体上可以分成两个部分:标记码(Tag)和压缩数据。

标记码由两个字节构成,其前一个字节是固定值 0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的 0xFF 填充,也就说连续的多个 0xFF可以被理解为一个 0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。

常用的标记有 SOIAPP0APPnDQTSOF0DHTDRISOSEOI

注意,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

jpeg-tag-soi.png

(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 。

jpeg-tag-app0.png

(3) APPn (Application) 应用程序保留标记 n,其中 n=1~15(任选)

0xFFE1~0xFFF

包含 2 个具体字段:

序号 名称 长度 描述
数据长度 2 字节 ①~② 2 个字段的总长度,即不包括标记代码,但包括本字段
详细信息 数据长度-2 字节 内容不定

例如,Adobe Photoshop 生成的 JPEG 图像中就用了 APP1 和 APP13 两个标记段分别存储了一幅图像的副本。

jpeg-tag-app1~app13.png

(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 次。

jpeg-tag-dqt.png

(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 次)。

jpeg-tag-sof0.png

(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 标记段只有一个哈夫曼表。

jpeg-tag-dht.png

(7) DRI (Define Restart Interval) 定义差分编码累计复位的间隔

0xFFDD

包含 2 个具体字段:

序号 名称 长度 描述
数据长度 2 字节 固定值 0x0004,①~② 两个字段的总长度,即不包括标记代码,但包括本字段
MCU 块的单元中的重新开始间隔 2字节 设其值为 n,则表示每 n 个 MCU 块就有一个 RSTn 标记。第一个标记是 RST0,第二个是 RST1 等,RST7 后再从 RST0 重复。

如果没有本标记段,或间隔值为 0 时,就表示不存在重开始间隔和标记 RST。

jpeg-tag-dri.png

(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 标记表示结束。

jpeg-tag-sos.png

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

0xFFD9

jpeg-tag-eoi.png

JPEG 标记总览

jpeg-tag-all.png

More

下一步,将用代码手动生成一张 JPEG 图片,文章目录:* 音视频入门文章目录 *


代码:
audio-video-blog-demos

参考资料:

JPEG-维基百科

jpeg.org

JPEG文件编/解码详解

Jpg文件格式[参考]

理解JPEG文件头的格式

jpeg图片格式详解

简述JPEG编码实现的基本步骤

JPG的工作原理

How JPG Works

JPEG图像压缩算法流程详解


本文由博客一文多发平台 OpenWrite 发布!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容