l DRI,Define Restart Interval,定義差分編碼累計復位的間隔
u 標記代碼 2字節 固定值0xFFDD
u 包含2個具體字段:
①數據長度 2字節 固定值0x0004,①~②兩個字段的總長度
即不包括標記代碼,但包括本字段
②MCU塊的單元中的重新開始間隔
2字節 設其值爲n,則表示每n個MCU塊就有一個
RSTn標記。第一個標記是RST0,第二個是
RST1等,RST7後再從RST0重複。
如果沒有本標記段,或間隔值爲0時,就表示不存在重開始間隔和標記RST
u 標記代碼 2字節 固定值0xFFDA
u 包含2個具體字段:
①數據長度 2字節 ①~④兩個字段的總長度
即不包括標記代碼,但包括本字段
②顏色分量數 1字節 應該和SOF中的字段⑤的值相同,即:
1:灰度圖是;3:YCrCb或YIQ;4:CMYK。
而JFIF中使用YCrCb,故這裏顏色分量數恆爲3
③顏色分量信息
a)顏色分量ID 1字節
b)直流/交流係數表號1字節 高4位:直流分量使用的哈夫曼樹編號
低4位:交流分量使用的哈夫曼樹編號
④ 壓縮圖像數據
a)譜選擇開始 1字節 固定值0x00
b)譜選擇結束 1字節 固定值0x3F
c)譜選擇 1字節 在基本JPEG中總爲00
本標記段中,字段③應該重複出現,有多少個顏色分量(字段②),就出現多少次(一般爲3次)。本段結束後,緊接着就是真正的圖像信息了。圖像信息直至遇到一個標記代碼就自動結束,一般就是以EOI標記表示結束。
u 標記代碼 2字節 固定值0xFFD9
這裏補充說明一下,由於在JPEG文件中0xFF具有標誌性的意思,所以在壓縮數據流(真正的圖像信息)中出現0xFF,就需要作特別處理。具體方法是,在數據0xFF後添加一個沒有意義的0x00。換句話說,如果在圖像數據流中遇到0xFF,應該檢測其緊接着的字符,如果是
1)0x00,則表示0xFF是圖像流的組成部分,需要進行譯碼;
2)0xD9,則與0xFF組成標記EOI,則圖像流結束,同時圖像文件結束;
3)0xD0~0xD7,則組成RSTn標記,則要忽視整個RSTn標記,即不對當前0xFF和緊接的0xDn兩個字節進行譯碼,並按RST標記的規則調整譯碼變量;
3)0xFF,則忽視當前0xFF,對後一個0xFF再作判斷;
4)其他數值,則忽視當前0xFF,並保留緊接的此數值用於譯碼。
二、 JPEG解碼過程詳解
下面來詳細講述JPEG文件的解碼過程。
1.讀入文件的相關信息
按照上述的JPEG文件數據存儲方式,把要解碼的文件的相關信息一一讀出,爲接下來的解碼工作做好準備。參考方法是,設計一系列的結構體對應各個標記,並存儲標記內表示的信息。其中圖像長寬、多個量化表和哈夫曼表、水平/垂直採樣因子等多項信息比較重要。以下給出讀取過程中的兩個問題。
1)整個文件的大體結構
JFIF格式的JPEG文件(*.jpg)的一般順序爲:
SOI(0xFFD8)
APP0(0xFFE0)
[APPn(0xFFEn)]可選
DQT(0xFFDB)
SOF0(0xFFC0)
DHT(0xFFC4)
SOS(0xFFDA)
壓縮數據
EOI(0xFFD9)
2)字的高低位問題
JPEG文件格式中,一個字(16位)的存儲使用的是Motorola格式,而不是Intel格式。也就是說,一個字的高字節(高8位)在數據流的前面,低字節(低8位)在數據流的後面,與平時習慣的Intel格式不一樣。.