1. 程式人生 > >JPEG解碼——(3)檔案頭解析

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表的重建有些複雜,涉及底層更多關於資料壓縮領域的知識,可以參考“正規化霍夫曼編碼”相關材料,本博文不再做介紹該編碼原