1. 程式人生 > >JPEG解碼--(1)JPEG檔案格式概覽

JPEG解碼--(1)JPEG檔案格式概覽

  由於懶和人的忘性,以前做的一些筆記再回過頭看時又有些生疏了,我決定把一些內容整理出來,以供有需要的來參考。

瞭解的人知道其價值所在,不知道的人就棄之如廢物吧。

  本篇是JPEG解碼系列的第一篇——JPEG檔案格式概覽。

1. 圖片檔案的資料是什麼?

  這是一幅人眼可視的圖片:

  

  這是其對應的二進位制資料:(由於二進位制資料量浩如煙海,只擷取頭部的一些資料,使用的工具是WinHex)

  

 2. 為什麼需要檔案格式來表達影象?

  這就凸顯了規範的重要性,使用同一套標準,各廠商都按照這個標準進行檔案格式封裝,那麼你拿到別人的照片後就知道

瞭如何進行(檔案格式)解析和(jpeg)解碼了。

  這也好理解,不同國家不同語言的人們如何交流?使用通用的標準——英語。

  jpeg檔案格式也自有其標準,檔案格式標準參考電聯的JFIF,編解碼標準參考電聯的ITU-T81。

3. 標準文件太長,沒耐心讀下去,怎麼辦?

  標準規範的頁碼都是很長的,用於照顧到各個角落和細節。

  但是,各個廠商實現時,肯定不會實現規範的全部內容,只需滿足標準中最重要的一部分即可。

4. jpeg二進位制資料解讀

  一般情況下,是按照這個順序排列的:

TAG型別 數值 名稱 其他備註
SOI 0xFFD8 Start of Image 必帶
APP0 0xFFE0 application0 必帶
APPn 0xFFEn applicationn 可選帶(APP1一般為Exif資訊)
DQT 0xFFDB Define Quantization Table 必帶
SOF 0xFFC0 Start of Frame 必帶
DHT 0xFFC4 Define Huffman Table 必帶
SOS 0xFFDA Start of Scan 必帶
compress data 。。。 。。。 必帶
EOI 0xFFD9 End of Image 必帶

 

 

 

 

 

 

 

 

 

 

 

 

   如下為標註各種型別TAG,其中EOI在檔案末尾未貼出來:

  

5. 關於各TAG的一些說明

  5.1) 檔名末尾.jpg不代表真的是一個jpeg圖片,因為你可以隨意更改一個檔案的字尾名。

  5.2)JPEG檔案必須以0xFF DB開頭和以0xFF D9結尾。

  5.3)DQT為量化表,該型別表有兩個表,一個表示Y分量的量化表,另外一個為UV分量共用的量化表。

    其中,TAG後面的0x 00 43表示這個TAG組中除去TAG兩個位元組外,共有多少個位元組組成,後面的0x00為第幾張表。

    量化表為DCT變換系數,由於是8x8的二維DCT變換,故係數個數為64,這也即是:0x43 - 3 = 0x40 = 64。

  5.4)SOF為幀影象開始,記錄了取樣精度、圖形寬/高、分量個數、水平/垂直取樣因子、量化表號等資訊。

        例如,摘抄下SOF下的這幾個位元組:0x00 11 08 02 D0 03 E0 03 01 22 00 02 11 01 03 11 01

       其中,0x00 11代表SOF下共有17位元組;

       0x08代表取樣精度,幾乎都是用8位進行取樣精度,即一個畫素點可以有2^8=256級過渡;

       0x02 D0代表影象高,即0x02d0=720畫素高;

       0x03 E0代表影象寬,即0x03E0=992畫素寬;

       0x03代表分量表數,為3,分別代表Y、U和V的表;

       0x01 22 00中第一個位元組01代表量化表序號(從1開始),第二個22代表水平/垂直取樣因子(高四位為水平取樣因子,第四位為垂直取樣因子),第三個00代表量化表id=0;

       0x02 11 01中第一個位元組01代表量化表序號為2,第二個11代表水平/垂直取樣因子都為1,第三個00代表量化表id=1;

       0x03 11 01中第一個位元組01代表量化表序號為3,第二個11代表水平/垂直取樣因子都為1,第三個00代表量化表id=2;

    需要補充說明一下,取樣因子和量化表的問題。

    取樣因子:該圖象的Y分量的寬/高取樣因子都為2,而UV分量的取樣因子都為1,則在同一個方向上(水平或垂直方向),Y分量取樣點是UV分量取樣點的2倍,

         如果影象Y分量寬高分別W和H,那麼U和V分量只採樣了W/2和H/2個點,這也代表原始圖象的size=1.5*W*H。

         有些影象的第一張表可能是2和1或1和2,再或都是1,但是第二和第三張表的取樣因子都是1。

    量化表:Y分量使用一張量化表,UV分量使用另外一張表,因為DQT表一般就兩張。

  5.5)DHT為霍夫曼表,由四個表組成,分表代表:

    [0][0]——直流霍夫曼表0,Y分量直流部分解碼時使用

    [0][1]——直流霍夫曼表0,UV分量直流部分解碼時使用

    [1][0]——交流霍夫曼表0,Y分量交流部分解碼時使用

    [1][1]——交流霍夫曼表1,UV分量交流部分解碼時使用

  5.6)SOS為掃描開始,其代表霍夫曼表關係進行對映。

  5.7)SOS後面就為真正的編碼資料,這是資料的大頭,相比於此,檔案頭的size其實是非常之少。

  5.8)EOI為影象結束的標誌,影象必須以此結