JPEG Marker:通常有 11 个 Marker,其中 9 个是带长度的 Segment

序号字节Marker段结构含义
1FF D8SOI无长度JPEG 文件开始(第一个字节就是它)
2FF E0APP0有长度JFIF 头(产业约定,通常第一个 APP)
3FF E1APP1有长度EXIF 约定 / XMP
4FF E2APP2有长度ICC 色彩配置约定
5FF E3~EFAPP3~APP15有长度无强约定,私有数据安全区
6FF DBDQT有长度量化表(常见 2 张:亮度表 + 色度表)
7FF C0SOF0有长度基线帧:宽/高/颜色分量/采样因子
8FF C1 / FF C2SOF1 / SOF2有长度扩展帧 / 渐进帧(取代 SOF0 出现)
9FF C4DHT有长度Huffman 表(常见 4 张:亮度/色度 × DC/AC)
10FF DDDRI有长度重启间隔(写 RST 标记时用)
11FF FECOM有长度注释(内容自由,也在这片段序列区)
12FF DASOS有长度扫描开始:选择分量、指定 Huffman 表
——熵编码数据无段结构真正的压缩码流(DCT 系数+Huffman 位流)
13FF D0~D7RSTn无长度重启标记(可选,DRI>0 时出现)
14FF D9EOI无长度JPEG 文件结束 ← 标准结构到此为止
——尾部附加非标准EOI 之后:我们自己规定的裸数据
※FF 01TEM无长度临时保留标记——标准里占个号,实际没有任何文件会写它

两种"附加自己的数据"对比

APP 段(规范内)EOI 后追加(规范外)
塞的时机编码时 jpeg_write_marker() 插入段序列编码后 fopen("ab") 追加文件尾
在文件中的位置文件前部,混在 marker 段里EOI 之后,文件最末尾
数据形态标准段结构:FF XX LL LL 数据裸字节,无结构无长度
解码器行为必须跳过,永不报错读到 EOI 就停,多数忽略;严格实现可能告警
读回方式jpeg_save_markers() 从 marker_list 取自己扫文件找最后 FF D9,挖尾部
大小限制段长度字段 2 字节,单段 ≤ 65533 字节无限制
适合元数据、给别人读的标准数据自用大块数据、图片+数据打包

写入APP区数据

读出APP区数据