不同JPEG文件存储格式定义
文章目录
- 不同JPEG文件存储格式定义
-
- [一、底层 JPEG 码流标记(Marker)通用规则](#一、底层 JPEG 码流标记(Marker)通用规则)
- [二、主流 JPEG 磁盘存储封装格式](#二、主流 JPEG 磁盘存储封装格式)
-
- [1. JFIF(JPEG File Interchange Format,JPEG 文件交换格式)](#1. JFIF(JPEG File Interchange Format,JPEG 文件交换格式))
- [2. EXIF(Exchangeable Image File Format,可交换图像文件格式)](#2. EXIF(Exchangeable Image File Format,可交换图像文件格式))
- [3. SPIFF(Still Picture Interchange File Format)](#3. SPIFF(Still Picture Interchange File Format))
- [4. JPEG‑in‑TIFF(TIFF 容器承载 JPEG 码流)](#4. JPEG‑in‑TIFF(TIFF 容器承载 JPEG 码流))
- [5. JPEG 原始裸码流(Raw JPEG bitstream)](#5. JPEG 原始裸码流(Raw JPEG bitstream))
- [三、基于 JPEG 标准内部模式(SOFn 标记区分,码流内部模式,不是扩展名)](#三、基于 JPEG 标准内部模式(SOFn 标记区分,码流内部模式,不是扩展名))
- [四、衍生家族独立文件存储格式(不兼容传统 JPG 码流)](#四、衍生家族独立文件存储格式(不兼容传统 JPG 码流))
- 五、工程实践对比总结表
- 六、开发常见坑
重要概念区分:JPEG (ISO‑10918‑1) 是压缩码流算法标准,只定义 DCT、量化、熵编码码流语法,本身没有定义完整磁盘文件格式 。我们日常的
.jpg是封装容器 + JPEG 压缩码流 组合产物。码流(bitstream):DCT 系数、MCU、Huffman / 量化表,是图像本体;
文件存储格式(容器):规定如何把码流、元数据、缩略图、相机参数组织成磁盘文件。
一、底层 JPEG 码流标记(Marker)通用规则
所有 JPEG 系文件都以0xFF作为标记前缀,标记格式:0xFF + Marker(1B) + 2B长度 + 段负载;SOI、EOI、RSTn 没有长度字段。
| 标记 | 十六进制 | 名称 | 核心作用 |
|---|---|---|---|
| SOI | 0xFFD8 | 图像开始 | 所有 JPEG 文件必为首 2 字节 |
| EOI | 0xFFD9 | 图像结束 | 文件图像数据结束标记 |
| SOF0 | 0xFFC0 | 基线 DCT 帧开始 | Baseline‑JPEG,记录宽高、采样、位深 |
| SOF2 | 0xFFC2 | 渐进 DCT 帧开始 | Progressive‑JPEG,多次扫描模式 |
| DQT | 0xFFDB | 定义量化表 | 存储压缩质量量化矩阵 |
| DHT | 0xFFC4 | 定义 Huffman 表 | 熵编码哈夫曼码表 |
| SOS | 0xFFDA | 扫描开始 | 真正压缩图像码流从此处开始 |
| DRI | 0xFFDD | 重启间隔 | MCU 重启间隔,用于错误恢复 |
| APP0 | 0xFFE0 | 应用段 0 | JFIF 元数据存放位置 ,标识符JFIF0 |
| APP1 | 0xFFE1 | 应用段 1 | EXIF 元数据存放位置 ,标识符Exif00 |
| APP2‑APP15 | 0xFFE2‑0xFFEF | 应用段 | ICC 色彩配置、XMP 元数据、JFXX 缩略图等 |
APPn 段属于可选元数据,解码器可以直接跳过 APPn 段仍然可以正常解码图像像素;真正解码图像必须:SOI‑DQT‑SOFn‑DHT‑SOS‑图像码流‑EOI。
二、主流 JPEG 磁盘存储封装格式
1. JFIF(JPEG File Interchange Format,JPEG 文件交换格式)
-
标准:ITU‑T T.871,1992;版本主流 1.02
-
扩展名:
.jpg/.jpeg/.jfif -
核心定位:JPEG 官方推荐的基础文件交换容器,解决原始 JPEG 码流没有色彩、分辨率、缩略图定义的问题。
-
文件结构:
SOI(0xFFD8) → APP0(JFIF标记0x4A46494600) → DQT → SOF0 → DHT → SOS → 压缩码流 → EOI -
APP0 段内容:版本号、像素密度 DPI 单位、X/Y 分辨率、可选 RGB 缩略图。
-
色彩约束:强制使用YCbCr BT.601,4:2:0/4:2:2/4:4:4 采样;不支持嵌入 ICC Profile。
-
特点:
-
PC、嵌入式、浏览器通用,兼容性最强;
-
只使用 APP0 标记,不携带相机拍摄元数据;
-
绝大多数图片工具导出 web 图片输出 JFIF。
-
现实中绝大多数
.jpg文件不是纯 JFIF,是 JFIF+EXIF 混合格式:SOI 之后同时存在 APP0 (JFIF)+APP1 (EXIF) 两段元数据。
2. EXIF(Exchangeable Image File Format,可交换图像文件格式)
-
标准:JEITA,数码相机行业标准;EXIF 不是独立压缩算法,是 JPEG 码流之上的元数据封装。
-
扩展名:依旧
.jpg/.jpeg,文件本体仍然是 JPEG DCT 码流。 -
存储载体:全部元数据放在 APP1(0xFFE1) 段内部;APP1 内部再嵌套 TIFF 格式 IFD 目录结构(大小端 II/MM 标记)。
-
APP1 内部存储:
-
IFD0:主图像标签(相机型号、快门、ISO、光圈、时间)
-
SubIFD:Exif 扩展标签
-
GPS‑IFD:GPS 经纬度坐标
-
IFD1:内嵌缩略图(缩略图本身又是一份小型 JPEG 码流)
-
-
文件典型顺序:
SOI → APP1(EXIF) → APP0(JFIF可选) → DQT → SOF0 → DHT → SOS → 图像码流 → EOI -
特点:
-
手机、相机拍照输出的 jpg 都是 EXIF 格式;
-
图像解码完全不依赖 EXIF,删除 APP1 段图片仍然正常显示;
-
很多嵌入式解码器会忽略 EXIF 元数据,只解析 SOF0 获取宽高。
-
坑点:部分老旧硬件解码器遇到超大 APP1 段会解析异常。
3. SPIFF(Still Picture Interchange File Format)
-
ISO 官方容器标准,设计初衷替代 JFIF;扩展名
.spf。 -
支持更多色彩空间、alpha 通道、元数据;但是产业几乎没有落地,几乎没有软件支持,现实工程废弃,仅历史文档存在。
4. JPEG‑in‑TIFF(TIFF 容器承载 JPEG 码流)
TIFF 文件内部把 JPEG 压缩码流作为 TIFF 的一个 strip/tile 数据。
-
后缀
.tif/.tiff;常用于印刷、扫描设备。 -
TIFF 头做索引,内部直接嵌入完整 JPEG 压缩 bitstream;不是日常 jpg。
5. JPEG 原始裸码流(Raw JPEG bitstream)
只有码流标记 SOI‑DQT‑SOF‑DHT‑SOS‑data‑EOI,没有任何 APP0/JFIF、APP1/EXIF 段。
-
无元数据,无 DPI、无相机信息;一般不会直接存磁盘;
-
常见场景:摄像头硬件 JPEG 解码器输出内存裸码流,直接写入 SD 卡如果不补 APP0 段,部分看图软件无法识别。
⚠️工程坑:裸 JPEG 码流缺少 JFIF 头,部分低端解码器会拒绝打开,需要补 APP0 (JFIF) 段。
三、基于 JPEG 标准内部模式(SOFn 标记区分,码流内部模式,不是扩展名)
注意:下面属于JPEG 码流内部编码模式,不是独立文件后缀,可以封装在 JFIF/EXIF 容器之内。
| 模式 | Marker 标记 | 说明 | 存储特点 |
|---|---|---|---|
| 基线 Baseline JPEG | SOF0 0xFFC0 | 顺序 DCT 有损,最主流 | MCU 从上到下顺序扫描;嵌入式首选;TJpgDec、绝大多数硬解支持 |
| 渐进 Progressive JPEG | SOF2 0xFFC2 | 多次扫描 DCT 有损 | 多轮 SOS 扫描;先模糊后清晰;增大内存开销,低端硬件不支持 |
| 扩展顺序 DCT | SOF1 0xFFC1 | 扩展顺序 DCT,算术编码 | 极少使用 |
| 旧 Lossless‑JPEG | SOF3 0xFFC3 | 原始标准无损模式,无 DCT | 压缩效率差,工程弃用,改用 JPEG‑LS |
| 分层 Hierarchical JPEG | 多 SOF 帧 | 多分辨率金字塔编码 | 几乎没有产品落地 |
四、衍生家族独立文件存储格式(不兼容传统 JPG 码流)
这些名字带 JPEG,但压缩算法、文件标记完全不一样,不能用普通 JPEG 解码器打开。
-
JPEG‑LS(
.jls)ISO‑14495;预测编码无损 / 近无损;自有文件标记,不使用 0xFFC0‑C2 的 SOF 标记;医疗、工业图像。
-
JPEG2000(
.jp2/.j2k)ISO‑15444;小波变换;独立盒子 (box) 文件结构,不再使用传统 JPEG Marker 体系;OpenJPEG 解码。
-
JPEG‑XL(
.jxl)ISO‑18181;全新盒子容器;支持无损转码传统 JPEG;现代新一代图像格式。
-
MJPEG(Motion‑JPEG)视频
不是单张图片文件;两种存储:
-
AVI/MOV 容器:每一帧存放一张完整 JFIF/EXIF JPEG 码流;
-
裸 MJPEG 流:连续拼接 SOI‑EOI 的 JPEG 码流,无文件头;常见 USB 摄像头输出。
五、工程实践对比总结表
| 存储格式 | 后缀 | 核心标记段 | 元数据来源 | 典型场景 | 嵌入式注意事项 |
|---|---|---|---|---|---|
| JFIF | .jpg .jfif |
SOI+APP0(0xFFE0) | APP0 存 DPI、缩略图 | 网页导出、截图 | 兼容性最好,裸码流建议补 APP0 |
| EXIF (JFIF+EXIF 混合) | .jpg |
SOI+APP0+APP1(0xFFE1) | APP1 存相机 / GPS 标签 | 手机、相机拍照 | 解码器可跳过 APP1;超大 APP1 可能导致老硬件异常 |
| 裸 JPEG 码流 | 无标准后缀 | 只有 SOI‑EOI,无 APPn | 无任何元数据 | 硬件 JPEG IP 内存输出 | 部分看图软件无法打开,需要补 JFIF 头 |
| SPIFF | .spf |
SPIFF 专属标记 | SPIFF 段 | 理论标准,几乎不用 | 不要使用 |
| JPEG‑in‑TIFF | .tif |
TIFF 头内部嵌入 JPEG 码流 | TIFF IFD 标签 | 印刷扫描 | 普通 JPEG 解码器不能直接读取 tif |
| JPEG‑LS | .jls |
JPEG‑LS 自有 marker | 自有元数据段 | 医疗工业无损图像 | 普通 JPEG 库完全无法解码 |
| JPEG2000 | .jp2 |
Box 盒子结构 | box 元数据 | 卫星医疗档案 | 需要 OpenJPEG 软件解码,无普通硬件 IP |
六、开发常见坑
-
混淆 "码流模式" 和 "文件容器":Baseline/Progressive 是码流内部 SOF0/SOF2 标记,既可以封装在 JFIF,也可以封装在 EXIF;EXIF 只是元数据,不改变图片是基线还是渐进。
-
硬件 JPEG 解码器:大多只解析码流标记 SOI/SOF0/DQT/DHT/SOS,直接跳过 APP0/APP1 元数据;所以一张 EXIF 照片硬件解码完全正常,只是读不到相机参数。
-
硬件 IP 输出裸 JPEG 码流:内存只有 SOI‑EOI,没有 APP0,保存到 SD 卡得到的文件部分 PC 软件无法预览,需要手动追加 APP0 (JFIF) 段。
-
判断图片是基线还是渐进:看 SOF 标记,不是看后缀 :
0xFFC0基线;0xFFC2渐进。 -
删除 EXIF:只删除 APP1 段,图像像素码流不受影响,图片仍然正常显示。
