JPEG(Joint Photographic Experts Group)是一种广泛使用的有损压缩图像格式,其文件结构遵循特定的规范。JPEG 文件通常以 .jpg 或 .jpeg 为扩展名。其内部结构基于 标记(Markers) 和 段(Segments) 的组合。

一、基本结构概述
JPEG 文件由一系列 标记段(Marker Segments) 构成,每个标记段以一个 两字节的标记(Marker) 开头,格式为 0xFF + 标记码(例如 0xFFD8 表示 SOI)。
主要组成部分:
-
SOI(Start of Image)
- 标记:
0xFFD8 - 表示 JPEG 图像的开始。
- 标记:
-
APPn 段(Application-specific segments)
- 标记:
0xFFE0到0xFFEF(如0xFFE0是 APP0,常用于 JFIF 信息;0xFFE1常用于 EXIF 数据) - 存放应用程序自定义数据,比如:
- JFIF(JPEG File Interchange Format)头
- EXIF(Exchangeable Image File Format)元数据(拍摄时间、相机型号、GPS 等)
- 标记:
-
DQT(Define Quantization Table)
- 标记:
0xFFDB - 定义量化表,用于解码时反量化 DCT 系数。
- 标记:
-
SOF(Start of Frame)
- 标记:常见如
0xFFC0(Baseline DCT)、0xFFC2(Progressive DCT)等 - 描述图像的基本参数,如:
- 图像高度、宽度
- 颜色分量数量(通常是 3:Y, Cb, Cr)
- 每个分量的采样因子(如 4:2:0)
- 每个分量使用的量化表编号
- 标记:常见如
-
DHT(Define Huffman Table)
- 标记:
0xFFC4 - 定义霍夫曼编码表,用于熵解码。
- 标记:
-
SOS(Start of Scan)
- 标记:
0xFFDA - 表示压缩图像数据的开始。
- 包含:
- 使用的分量列表
- 对应的霍夫曼表编号
- 之后就是实际的压缩图像数据(熵编码后的 DCT 系数)
- 标记:
-
压缩图像数据(Entropy-coded data)
- 不以标记开头,但若出现
0xFF,后面会跟一个填充字节0x00(称为 stuffing byte),避免误判为标记。
- 不以标记开头,但若出现
-
EOI(End of Image)
- 标记:
0xFFD9 - 表示 JPEG 图像结束。
- 标记:
二、典型 JPEG 文件结构顺序(Baseline JPEG)
+------------------+
| SOI (0xFFD8) |
+------------------+
| APP0 / APP1 ... | ← 可选,包含 JFIF/EXIF 等
+------------------+
| DQT | ← 一个或多个量化表
+------------------+
| SOF0 (0xFFC0) | ← 基线 JPEG 的帧头
+------------------+
| DHT | ← 一个或多个霍夫曼表
+------------------+
| SOS (0xFFDA) |
+------------------+
| 压缩图像数据 | ← 可能包含 0xFF00 转义
+------------------+
| EOI (0xFFD9) |
+------------------+
注意:某些 JPEG(如渐进式 JPEG)可能包含多个 SOS 段和多个扫描。
三、关键点说明
-
所有标记都是大端序(Big-endian)
-
标记长度字段 :除 SOI、EOI 和压缩数据外,大多数段在标记后紧跟一个 2 字节的长度字段 (包括长度字段本身),例如:
FF C0 00 11 ... ↑↑------ 长度 = 0x0011 = 17 字节(包括这2字节) -
颜色空间 :JPEG 内部使用 YCbCr 色彩空间(即使原始图像是 RGB),通过色彩空间转换和子采样实现压缩。
四、示例:用十六进制查看 JPEG 头部
hex
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 48 ← SOI + APP0(JFIF)
00 48 00 00 FF DB 00 43 00 01 01 01 01 01 01 01 ← DQT
...
FF C0 00 11 08 02 80 01 E0 03 01 22 00 02 11 01 ← SOF0 (640x480)
...
FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 ... ← SOS + 压缩数据
...
FF D9 ← EOI
五、参考资料
- ISO/IEC 10918-1(ITU-T T.81):JPEG 标准文档
- JPEG File Interchange Format (JFIF) specification
- EXIF specification(由 JEITA 制定)
如需解析或生成 JPEG 文件,建议使用成熟的库(如 libjpeg、Pillow、OpenCV),因为手动处理霍夫曼编码、DCT 反变换等非常复杂。
如果你对某一部分(如 DHT 结构、SOS 后的数据流格式)感兴趣,我可以进一步展开说明。