不同JPEG文件存储格式定义

不同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。

  • 特点:

    1. PC、嵌入式、浏览器通用,兼容性最强;

    2. 只使用 APP0 标记,不携带相机拍摄元数据;

    3. 绝大多数图片工具导出 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

  • 特点:

    1. 手机、相机拍照输出的 jpg 都是 EXIF 格式;

    2. 图像解码完全不依赖 EXIF,删除 APP1 段图片仍然正常显示;

    3. 很多嵌入式解码器会忽略 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 解码器打开

  1. JPEG‑LS(.jls

    ISO‑14495;预测编码无损 / 近无损;自有文件标记,不使用 0xFFC0‑C2 的 SOF 标记;医疗、工业图像。

  2. JPEG2000(.jp2 / .j2k

    ISO‑15444;小波变换;独立盒子 (box) 文件结构,不再使用传统 JPEG Marker 体系;OpenJPEG 解码。

  3. JPEG‑XL(.jxl

    ISO‑18181;全新盒子容器;支持无损转码传统 JPEG;现代新一代图像格式。

  4. 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

六、开发常见坑

  1. 混淆 "码流模式" 和 "文件容器":Baseline/Progressive 是码流内部 SOF0/SOF2 标记,既可以封装在 JFIF,也可以封装在 EXIF;EXIF 只是元数据,不改变图片是基线还是渐进。

  2. 硬件 JPEG 解码器:大多只解析码流标记 SOI/SOF0/DQT/DHT/SOS,直接跳过 APP0/APP1 元数据;所以一张 EXIF 照片硬件解码完全正常,只是读不到相机参数。

  3. 硬件 IP 输出裸 JPEG 码流:内存只有 SOI‑EOI,没有 APP0,保存到 SD 卡得到的文件部分 PC 软件无法预览,需要手动追加 APP0 (JFIF) 段。

  4. 判断图片是基线还是渐进:看 SOF 标记,不是看后缀0xFFC0基线;0xFFC2渐进。

  5. 删除 EXIF:只删除 APP1 段,图像像素码流不受影响,图片仍然正常显示。