JPEG(JPG)文件格式是一种基于标记(Marker)的二进制结构,其核心由多个功能段(Segments)按严格顺序组成,每个段以十六进制标记码开头。以下是对其文件结构的详细解读,结合十六进制数据特征和功能说明:
1. 文件头与文件尾
- SOI(Start of Image)
- 标记码:
0xFFD8 - 功能:标识JPEG文件起始,所有合法JPEG文件必须以
FF D8开头。 - 示例:文件开头的前两字节必须为
FF D8,否则文件无效。
- 标记码:
- EOI(End of Image)
- 标记码:
0xFFD9 - 功能:标识图像数据结束,解码器遇到此标记即停止解析。
- 示例:文件末尾的最后两字节通常为
FF D9。
- 标记码:
2. 关键数据段结构
JPEG文件的主体由多个段组成,每个段的通用结构如下:
| 字段 | 字节数 | 说明 |
|---|---|---|
| 段标识 | 1字节 | 固定为0xFF,表示新段开始。 |
| 段类型 | 1字节 | 标记码(如0xE0表示APP0,0xC0表示SOF0)。 |
| 段长度 | 2字节 | 大端序(Motorola格式),包含段内容和长度自身,不包含标识和类型。 |
| 段内容 | 可变长度 | 最大65533字节,存储具体参数或数据。 |
核心段详解
- APP0(应用数据段)
- 标记码:
0xFFE0 - 功能:存储图像识别信息(如JFIF标识符
4A 46 49 46 00)、版本号、像素密度单位(英寸/cm)、缩略图信息等。 - 示例:
FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 00 01 00 00
- 标记码:
- DQT(量化表段)
- 标记码:
0xFFDB - 功能:定义量化表,决定压缩质量。通常包含亮度(Y)和色度(Cb/Cr)两套量化表。
- 示例:
FF DB 00 43 00 [64字节亮度表] FF DB 00 43 01 [64字节色度表]
- 标记码:
- SOF0(图像基本信息段)
- 标记码:
0xFFC0 - 功能:存储图像宽高、颜色分量数(如YCbCr为3)、采样因子、量化表ID等。
- 示例(320×480像素,YCbCr格式):
FF C0 00 11 08 01 E0 01 40 03 01 22 00 02 11 01 03 11 01
- 标记码:
- DHT(哈夫曼表段)
- 标记码:
0xFFC4 - 功能:定义哈夫曼编码表,分为DC(直流量)和AC(交流量)表,每组表包含亮度/色度数据。
- 示例:
FF C4 00 1F 00 [DC表数据] FF C4 00 B5 10 [AC表数据]
- 标记码:
- SOS(扫描开始段)
- 标记码:
0xFFDA - 功能:标记压缩数据开始,后接哈夫曼编码的熵编码数据(按8×8分块存储)。
- 特殊处理:数据流中若出现
0xFF需转义为0xFF00,0xFFD0~0xFFD7为重启标记(RSTn)。
- 标记码:
3. 数据流与压缩特性
- 压缩数据:位于SOS段后,采用哈夫曼编码和游程编码(RLE),DC系数存储差值,AC系数按Zigzag顺序排列。
- 颜色空间转换:原始RGB数据转换为YCbCr,Y(亮度)分量量化更精细,U/V(色度)分量可能降采样。
- 标记填充:段间可插入多个
0xFF填充字节,解码器需忽略。
4. 文件验证与特征
- 特征字:合法JPEG文件必须以
FF D8开头,FF D9结尾,中间可包含FF E0(APP0)、FF DB(DQT)等标记。 - 错误检测:若文件缺少关键段(如SOF0、DHT、SOS)或标记顺序错误,可能导致解码失败。
总结
JPEG文件通过标记段组织数据,其十六进制结构体现了分层压缩的思想:元数据(APPn、DQT)定义压缩参数,熵编码数据(SOS后)实现高效存储。理解这些标记和段结构有助于分析文件完整性或实现低级编辑(如元数据修改或隐写分析)

