JPEG解碼——(3)檔案頭解析
與具體的編碼資料空間相比,jpeg檔案頭佔據非常小乃至可以忽略不計的大小。
仍然拿JPEG解碼--(1)JPEG檔案格式概覽中的《animal park》這張圖片來舉例,從跳過SOS(FF DA)的TAG開始——0x153,
就真正進入了編碼資料區域,如下圖所示:
其佔據的比例為:0x153/0x9721 = 339/38689 = 0.876%,還不到1%,其他jpeg圖片也是類似情況。
但是,就是這麼小的資料區域,卻是至關重要的地方,某些關鍵的地方一個位元組出錯了的話,解碼就會出錯(例如huffman table
中資料),或者重建出的yuv影象異常(例如quantization table中資料)!
本篇部落格主要介紹jpeg頭資訊解析,其中除了huffman table重建較複雜外,其他TAG的解析都比較容易。
1. APP0——FF EO
先貼出這段區域:
從ASCII值可以看出,儲存了JFIF——JPEG File Interchange Format(JPEG檔案交換格式),後面的幾個位元組應該是version信
息吧,沒深究。
2. DQT——FF DB
量化表有兩個,上面貼圖只高亮了其中一個表。
從offset=0x16開始的兩個位元組(0x00 43)為這段區域的size=67,後面的一個位元組為表的ID——0x00=0(可以看到第二張表中對
應位置offset=0x5D處為0x1)。
跳過前面三位元組從offset=0x19處開始的64位元組,即為量化表中量化值。其中需要說明的是,量化值是固定為64位元組的,因為按8X8
進行DCT變換的。
工具解析的結果如下:
需要補充兩點:
A.亮度訊號的Y分量使用DQT表一,UV分量使用表二。
B.亮度訊號通常採用細量化(量化值較小),對應位置處,表一通常比表二值要小。此量化原因是人眼對亮度訊號比較敏感,採用顆粒度
較細來量化,細量化引入的一個問題會消耗更多的資料空間。
3. SOF——FF C0
在該JPEG解碼系列中第一篇已經詳細介紹過了,不再贅述。工具解析如下:
4. DHT——FF C4
共有四張表,上面只貼出第一張表。
DHT表的重建有些複雜,涉及底層更多關於資料壓縮領域的知識,可以參考“正規化霍夫曼編碼”相關材料,本博文不再做介紹該編碼原