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為影象結束的標誌,影象必須以此結