因爲懶和人的忘性,之前作的一些筆記再回過頭看時又有些生疏了,我決定把一些內容整理出來,以供有須要的來參考。html
瞭解的人知道其價值所在,不知道的人就棄之如廢物吧。git
本篇是JPEG解碼系列的第一篇——JPEG文件格式概覽。github
1. 圖片文件的數據是什麼?app
這是一幅人眼可視的圖片:工具
這是其對應的二進制數據:(因爲二進制數據量浩如煙海,只截取頭部的一些數據,使用的工具是WinHex)編碼
2. 爲何須要文件格式來表達圖像?spa
這就凸顯了規範的重要性,使用同一套標準,各廠商都按照這個標準進行文件格式封裝,那麼你拿到別人的照片後就知道code
瞭如何進行(文件格式)解析和(jpeg)解碼了。htm
這也好理解,不一樣國家不一樣語言的人們如何交流?使用通用的標準——英語。blog
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爲圖像結束的標誌,圖像必須以此結束。