首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

JPEG 圖像文件結構深度解析:JFIF 格式、標記段、壓縮流程

     編輯:關於C語言

JPEG 壓縮編碼流程

  1. 8×8 分塊
  2. 正向離散余弦變換 (FDCT)
  3. 量化
  4. Z 字形掃描
  5. DC 係數 DPCM 編碼
  6. AC 係數 RLE 編碼
  7. 熵編碼(哈夫曼/算術)

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 0xD9EOI 標記結束解碼
0xFF 0xD0~0xD7RSTm 重啟標記忽略該標記,重置 DC 差分預測器、位對齊
0xFF 0xFF填充字節忽略第一個 0xFF,重新判斷第二個
0xFF 其他其他標記忽略 0xFF,保留次字節參與解碼

常見變體

  • Exif:存儲於 APP1 (0xFFE1),包含拍攝參數、GPS、縮略圖。
  • Adobe Photoshop:使用 APP13 (0xFFED) 存儲圖層、色彩配置文件等。
  • Progressive JPEG:多掃描,SOF2 (0xFFC2),數據流分多次精化。

解析器實現提示

  1. 順序讀取字節,遇 0xFF 判斷次字節決定標記類型。
  2. 按長度字段跳過段數據(大端序讀取長度)。
  3. SOS 後進入位流解碼狀態機,處理 0xFF 轉義。
  4. 驗證必要段存在性:SOI、SOF、DHT、DQT、SOS、EOI。

總結

JPEG/JFIF 以標記段組織元數據,壓縮數據流採用基線 DCT + 哈夫曼編碼。理解段結構與 0xFF 轉義規則,是編寫解析器、隱寫工具、取證分析器的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved