JPEG Marker:通常有 11 个 Marker,其中 9 个是带长度的 Segment
| 序号 | 字节 | Marker | 段结构 | 含义 |
| 1 | FF D8 | SOI | 无长度 | JPEG 文件开始(第一个字节就是它) |
| 2 | FF E0 | APP0 | 有长度 | JFIF 头(产业约定,通常第一个 APP) |
| 3 | FF E1 | APP1 | 有长度 | EXIF 约定 / XMP |
| 4 | FF E2 | APP2 | 有长度 | ICC 色彩配置约定 |
| 5 | FF E3~EF | APP3~APP15 | 有长度 | 无强约定,私有数据安全区 |
| 6 | FF DB | DQT | 有长度 | 量化表(常见 2 张:亮度表 + 色度表) |
| 7 | FF C0 | SOF0 | 有长度 | 基线帧:宽/高/颜色分量/采样因子 |
| 8 | FF C1 / FF C2 | SOF1 / SOF2 | 有长度 | 扩展帧 / 渐进帧(取代 SOF0 出现) |
| 9 | FF C4 | DHT | 有长度 | Huffman 表(常见 4 张:亮度/色度 × DC/AC) |
| 10 | FF DD | DRI | 有长度 | 重启间隔(写 RST 标记时用) |
| 11 | FF FE | COM | 有长度 | 注释(内容自由,也在这片段序列区) |
| 12 | FF DA | SOS | 有长度 | 扫描开始:选择分量、指定 Huffman 表 |
| — | — | 熵编码数据 | 无段结构 | 真正的压缩码流(DCT 系数+Huffman 位流) |
| 13 | FF D0~D7 | RSTn | 无长度 | 重启标记(可选,DRI>0 时出现) |
| 14 | FF D9 | EOI | 无长度 | JPEG 文件结束 ← 标准结构到此为止 |
| — | — | 尾部附加 | 非标准 | EOI 之后:我们自己规定的裸数据 |
| ※ | FF 01 | TEM | 无长度 | 临时保留标记——标准里占个号,实际没有任何文件会写它 |
| APP 段(规范内) | EOI 后追加(规范外) |
| 塞的时机 | 编码时 jpeg_write_marker() 插入段序列 | 编码后 fopen("ab") 追加文件尾 |
| 在文件中的位置 | 文件前部,混在 marker 段里 | EOI 之后,文件最末尾 |
| 数据形态 | 标准段结构:FF XX LL LL 数据 | 裸字节,无结构无长度 |
| 解码器行为 | 必须跳过,永不报错 | 读到 EOI 就停,多数忽略;严格实现可能告警 |
| 读回方式 | jpeg_save_markers() 从 marker_list 取 | 自己扫文件找最后 FF D9,挖尾部 |
| 大小限制 | 段长度字段 2 字节,单段 ≤ 65533 字节 | 无限制 |
| 适合 | 元数据、给别人读的标准数据 | 自用大块数据、图片+数据打包 |