JPEG 壓縮編碼流程
- 8×8 分塊
- 正向離散余弦變換 (FDCT)
- 量化
- Z 字形掃描
- DC 係數 DPCM 編碼
- AC 係數 RLE 編碼
- 熵編碼(哈夫曼/算術)
JFIF 文件結構:標記段 + 壓縮數據
標記碼:兩字節,首字節固定 0xFF,次字節表示類型。標記碼前可有任意填充 0xFF。標記碼後緊跟該段數據。
核心標記段詳解
SOI (Start of Image) 0xFFD8
文件開始,無數據負載。
APP0 (JFIF 標識) 0xFFE0
| 字段 | 長度 | 說明 |
| 長度 | 2 字節 | 含自身,不含標記碼 |
| 標識符 | 5 字節 | "JFIF\0" (0x4A46494600) |
| 版本 | 2 字節 | 通常 0x0102 (1.02) |
| 密度單位 | 1 字節 | 0=無,1=DPI,2=DPCM |
| X/Y 密度 | 各 2 字節 | 水平/垂直像素密度 |
| 縮略圖尺寸 | 各 1 字節 | 0 表示無縮略圖 |
| 縮略圖數據 | 3×W×H 字節 | RGB 24 位 |
DQT (Define Quantization Table) 0xFFDB
- 可包含多張量化表(最多 4 張,ID 0~3)。
- 每表:1 字節精度+ID(高 4 位精度 0=8bit/1=16bit,低 4 位 ID),隨後 64×(精度+1) 字節係數(Z 字形序)。
SOF0 (Start of Frame, Baseline DCT) 0xFFC0
- 幀頭:精度(1B)、高度(2B)、寬度(2B)、分量數(1B,通常 3=YCbCr)。
- 每分量:ID(1B)、采樣因子(1B,高 4 位水平/低 4 位垂直)、量化表 ID(1B)。
DHT (Define Huffman Table) 0xFFC4
- 可含多張表(DC/AC 分開,各 2 張,ID 0~1)。
- 每表:類型+ID(1B)、16 字節碼長分佈、後接葉子節點值序列。
DRI (Define Restart Interval) 0xFFDD
- 長度固定 4 (0x0004),間隔值
n:每 n 個 MCU 插入 RSTm 標記(m=0~7 循環)。
SOS (Start of Scan) 0xFFDA
- 掃描頭:分量數、每分量(ID、DC/AC 表選擇)、譜選擇(0, 63, 0)。
- 緊接熵編碼壓縮數據流,直至遇到
0xFF 開頭的標記碼(通常 EOI)。
EOI (End of Image) 0xFFD9
文件結束,無數據。
壓縮數據流中 0xFF 的特殊處理
| 遇到字節序列 | 含義 | 解碼器動作 |
0xFF 0x00 | 數據字節 0xFF | 輸出 0xFF,繼續解碼 |
0xFF 0xD9 | EOI 標記 | 結束解碼 |
0xFF 0xD0~0xD7 | RSTm 重啟標記 | 忽略該標記,重置 DC 差分預測器、位對齊 |
0xFF 0xFF | 填充字節 | 忽略第一個 0xFF,重新判斷第二個 |
0xFF 其他 | 其他標記 | 忽略 0xFF,保留次字節參與解碼 |
常見變體
- Exif:存儲於 APP1 (0xFFE1),包含拍攝參數、GPS、縮略圖。
- Adobe Photoshop:使用 APP13 (0xFFED) 存儲圖層、色彩配置文件等。
- Progressive JPEG:多掃描,SOF2 (0xFFC2),數據流分多次精化。
解析器實現提示
- 順序讀取字節,遇
0xFF 判斷次字節決定標記類型。
- 按長度字段跳過段數據(大端序讀取長度)。
- SOS 後進入位流解碼狀態機,處理
0xFF 轉義。
- 驗證必要段存在性:SOI、SOF、DHT、DQT、SOS、EOI。
總結
JPEG/JFIF 以標記段組織元數據,壓縮數據流採用基線 DCT + 哈夫曼編碼。理解段結構與 0xFF 轉義規則,是編寫解析器、隱寫工具、取證分析器的基礎。