解讀 JPG圖片結構

文章源自:http://hi.baidu.com/359325424/item/09d3a53771756d392e0f818e

JPG文件結構分析


一、簡述
JPEG是一個壓縮標準,又可分爲標準 JPEG、漸進式JPEG及JPEG2000三種:

①標準JPEG:以24位顏色存儲單個光柵圖像,是與平臺無關的格式,支持最高級 別的壓縮,不過,這種壓縮是有損耗的。此類型圖片在網頁下載時只能由上而下依序顯示圖片,直到圖片資料全部下載完畢,才能看到全貌。
②漸進式 JPEG:漸進式JPG爲標準JPG的改良格式,支持交錯,可以在網頁下載時,先呈現出圖片的粗略外觀後,再慢慢地呈現出完整的內容,漸進式JPG的文件 比標準JPG的文件要來得小。
③JPEG2000:新一代的影像壓縮法,壓縮品質更好,其壓縮率比標準JPEG高約30%左右,同時支持有損 和無損壓縮。一個極其重要的特徵在於它能實現漸進傳輸,即先傳輸圖像的輪廓,然後逐步傳輸數據,讓圖像由朦朧到清晰顯示。

以一幅24 位彩色圖像爲例,JPEG的壓縮分爲四個步驟:

①顏色轉換:在將彩色圖像進行壓縮之前,必須先對顏色模式進行數據轉換。轉換完成之後 還需要進行數據採樣。
②DCT 變換:是將圖像信號在頻率域上進行變換,分離出高頻和低頻信息的處理過程,然後再對圖像的高頻部分(即圖像細 節)進行壓縮。首先以象素爲單位將圖像劃分爲多個8×8的矩陣,然後對每一個矩陣作DCT 變換。把8×8的象素矩陣變成8×8的頻率係數矩陣(所謂頻率 就是顏色改變的速度),頻率係數都是浮點數。
③量化:由於下面第四步編碼過程中使用的碼本都是整數,因此要對頻率係數進行量化,將之轉換爲整 數。數據量化後,矩陣中的數據都是近似值,和原始圖像數據之間有了差異,這一差異是造成圖像壓縮後失真的主要原因。這一過程中,質量因子的選取至爲重要。 值選得大,可以大幅度提高壓縮比,但是圖像質量就比較差,質量因子越小圖像重建質量越好,但是壓縮比越低。
④編碼:編碼是基於統計特性的方 法。

四個步驟都完成後的JPEG文件,其基本數據結構爲兩大類型:“段”和經過壓縮編碼的圖像數據。


二、數 據結構

1.段的一般結構如下表所示:

表1:段的一般結構
-----------------------------------------------------------------
名 稱    字節數 數據  說明
-----------------------------------------------------------------
段 標識   1     FF    每個新段的開始標識
段類型   1           類型編碼(稱作“標記碼”)
段長 度   2           包括段內容和段長度本身,不包括段標識和段類型
段內容               ≤65533字節
-----------------------------------------------------------------
說明:
①JPG 文件中所有關於寬度高度長度間隔這一類數據,凡是>1字節的,均採用Motorola格式,即:高位在前,低位在後。
② 有些段沒有長度描述也沒有內容,只有段標識和段類型。文件頭和文件尾均屬於這種段。
③段與段之間無論有多少FF都是合法的,這些FF稱爲“填充字 節”,必須被忽略掉。


2.段類型有30種,但只有10種是必須被所有程序識別的,其它的類型都可以忽略。所以下面只列出這 10種類型。

表2:段類型
---------------------------------------
名稱  標 記碼  說明
---------------------------------------
SOI    D8     文件頭
EOI    D9     文 件尾
SOF0   C0     幀開始(標準 JPEG)
SOF1   C1     同上
DHT    C4     定 義 Huffman 表(霍夫曼表)
SOS    DA     掃描行開始
DQT    DB     定義量化表
DRI    DD     定 義重新開始間隔
APP0   E0     定義交換格式和圖像識別信息
COM    FE     註釋
-----------------------------------------------------------
說明:有的文章也將DNL段(標記碼=DC,定義掃描行數)列爲必須段。


3.以下按一般JPEG文件的段排列順序詳細介紹 各種段的結構:

表3:SOI(文件頭)
-----------------
名稱  字節數   值
-----------------
段 標識   1     FF
段類型   1     D8 
-----------------
說明:這兩個字節構成了 JPEG文件頭。


表4:APP0(圖像識別信息)
--------------------------------------------------------------------------
名 稱       字節數 值          說明
--------------------------------------------------------------------------
段 標識        1   FF
段類型        1   E0
段長度        2   0010        如果有 RGB縮略圖就=16+3n
(以下爲段內容)
交換格式      5   4A46494600  “JFIF”的ASCII碼
主 版本號      1
次版本號      1  
密度單位      1               0=無單位;1=點數/英 寸;2=點數/釐米
X像素密度     2               水平方向的密度   
Y像素密 度     2               垂直方向的密度
縮略圖X像素   1               縮略圖水平像素數目  
縮 略圖Y像素   1               縮略圖垂直像素數目
(如果“縮略圖X像素”和“縮略圖Y像素”的值均>0,那麼纔有下面的數 據)
RGB縮略圖    3×n             n=縮略圖像素總數=縮略圖X像素×縮略圖Y像素
--------------------------------------------------------------------------
說明:
①JFIF是JPEG File Interchange Format的縮寫,即JPEG文件交換格式,另外還有TIFF等格式,很少 用
②“如果有RGB縮略圖就=16+3n”是什麼意思呢?比如說“縮略圖X像素”和“縮略圖Y像素”的值均爲48,就表示有一個48×48像素的 縮略圖(n=48×48),縮略圖是24位真彩位圖,用3個字節來表示一個像素,所以共佔用3n個字節。但大多數JPG文件都沒有這個“雞肋”縮略圖。


表 5:COM(註釋)
--------------------------------------------------------------------------
名 稱    字節數   值    說明
--------------------------------------------------------------------------
段 標識    1      FF
段類型    1      FE
段長度    2            其值=註釋字符的字節數+2
段 內容                 註釋字符
--------------------------------------------------------------------------
說明:有的JPEG文件沒有這個段。

 

作者:一 江秋水      發表時間:2010-1-30 9:59:00

 第1樓  


表6:DQT(定義量化表)

--------------------------------------------------------------------------
名 稱    字節數   值    說明
--------------------------------------------------------------------------
段 標識    1      FF
段類型    1      DB
段長度    2      43    其值=3+n(當只有一個 QT時)
(以下爲段內容)
QT信息    1            0-3位:QT號
4-7 位:QT精度(0=8bit,1字節;否則=16bit,2字節)
QT        n            n=64×QT精度的字節數
--------------------------------------------------------------------------
說明:
①JPEG文件一般有2個DQT段,爲Y值(亮度)定義1個, 爲C值(色度)定義1個。 
②一個DQT段可以包含多個 QT, 每個都有自己的信息字節


表7:SOF0(圖像基本信息)
--------------------------------------------------------------------------
名 稱  字節數   值    說明
--------------------------------------------------------------------------
段 標識   1     FF
段類型   1     C0
段長度   2           其值=8+組件數量×3
(以 下爲段內容)
樣本精度  1    8     每個樣本位數(大多數軟件不支持12和16)
圖片高度  2
圖片寬度  2
組 件數量  1    3     1=灰度圖,3=YCbCr/YIQ 彩色圖,4=CMYK 彩色圖
(以下每個組件佔用3字節)
組 件 ID   1          1=Y, 2=Cb, 3=Cr, 4=I, 5=Q
採樣係數  1          0-3位:垂直採 樣係數
4-7位:水平採樣係數
量化表號  1
---------------------------------------------------------------------------
說明:
①JPEG大都採用yCrCb色彩模型(y表示亮度,Cr紅色分量,Cb表示藍色分量),所以組件數量一般=3
②樣本就是單個像 素的顏色分量,也可理解爲一個樣本就是一個組件
③採樣係數是實際採樣方式與最高採樣係數之比,而最高採樣係數一般=0.5(分數表示爲1/2)。 比如說,垂直採樣係數=2,那麼2×0.5=1,表示實際採樣方式是每個點採一個樣,也就是逐點採樣;如果垂直採樣係數=1,那 麼:1×0.5=0.5(分數表示爲1/2),表示每2個點採一個樣


表8:DHT(定義Huffman表)
--------------------------------------------------------------------------
名 稱    字節數   值    說明
--------------------------------------------------------------------------
段 標識    1      FF
段類型    1      C4
段長度    2            其值=19+n(當只有一個 HT表時)
(以下爲段內容)
HT信息    1            0-3位:HT號
4 位:   HT類型, 0=DC表,1=AC表
5-7位:必須=0
HT位 表    16           這16個數的和應該≤256
HT值表    n            n=表頭16個數的和
--------------------------------------------------------------------------
說明:
①JPEG文件裏有2類Haffman 表:一類用於DC(直流量),一類用於AC(交流量)。一般有4個表:亮度的DC和AC,色度的 DC和AC。最多可有6個。
②一個DHT 段可以包含多個HT表, 每個都有自己的信息字節
③HT表是一個按遞增次序代碼長度排列的符號 表。


表9:DRI(定義重新開始間隔)
--------------------------------------------------------------------------
名 稱    字節數   值    說明
--------------------------------------------------------------------------
段 標識    1      FF
段類型    1      DD
段長度    2      4 
(以下爲段內容)
開 始間隔  2      n    復位標記的間隔距離
---------------------------------------------------------------------------
說明:
①開始間隔表示在壓縮數據流中,每隔n個MCU 塊就有一個RST標記,RST標記將Huffman 的解碼數據流復位,DC也重新從0 開始,因此,RST標記是一種復位標記
②RST 標記是一種特殊的段,它只具有段標識和段類型(長度=2字節),但它不是獨立的段,只能穿插在數 據流中(文件頭和文件尾段也只有段標識和段類型,卻都是獨立的段)。
③RST標記共有8個(RST0-RST7),從RST0起開始使用,然後是 RST1....直至RST7,再從RST0重複。
④RST標記的標識碼是 FFD0-FFD7,對應 RST0-RST7
⑤筆者查看了 許多自己電腦上的JPG文件的數據,未發現DRI段和RST標記,所以無法進行詳盡的考察


表10:SOS(掃描行開始)
--------------------------------------------------------------------------
名 稱          字節數   值    說明
--------------------------------------------------------------------------
段 標識           1     FF
段類型           1     DA
段長 度           2     000C  其值=6+2×掃描行內組件數量
(以下爲段內容)
掃描行內組件數 量 1     3     必須≥1,≤4(否則錯誤),通常=3
(以下每個組件佔用2字節)
組件 ID           1           1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q
Huffman表 號      1           0-3位:AC表號 (其值=0...3)
4-7 位:DC表號(其值=0...3)

3           最後3個字節用途不明,忽略
--------------------------------------------------------------------------
說明:緊接SOS段後的是壓縮的圖像數據(一個個掃描行),數據存放順序是從左到右、從上到下。


表11:EOI(文件尾)
------------------
名 稱  字節數   值
------------------
段標識   1     FF
段類型   1     D9 
------------------
說明:這兩個字節構成了JPEG文件尾。

 

三、實例分析
用系統自帶的畫圖程序畫一個32×24的紅色方塊,另存爲JPG文件,這個文件的全部數據如下:

0000: FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60
0010: 00 60 00 00 FF DB 00 43 00 08 06 06 07 06 05 08
0020: 07 07 07 09 09 08 0A 0C 14 0D 0C 0B 0B 0C 19 12
0030: 13 0F 14 1D 1A 1F 1E 1D 1A 1C 1C 20 24 2E 27 20
0040: 22 2C 23 1C 1C 28 37 29 2C 30 31 34 34 34 1F 27
0050: 39 3D 38 32 3C 2E 33 34 32 FF DB 00 43 01 09 09
0060: 09 0C 0B 0C 18 0D 0D 18 32 21 1C 21 32 32 32 32
0070: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
0080: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
0090: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 FF C0
00A0: 00 11 08 00 18 00 20 03 01 22 00 02 11 01 03 11
00B0: 01 FF C4 00 1F 00 00 01 05 01 01 01 01 01 01 00
00C0: 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09
00D0: 0A 0B FF C4 00 B5 10 00 02 01 03 03 02 04 03 05
00E0: 05 04 04 00 00 01 7D 01 02 03 00 04 11 05 12 21
00F0: 31 41 06 13 51 61 07 22 71 14 32 81 91 A1 08 23
0100: 42 B1 C1 15 52 D1 F0 24 33 62 72 82 09 0A 16 17
0110: 18 19 1A 25 26 27 28 29 2A 34 35 36 37 38 39 3A
0120: 43 44 45 46 47 48 49 4A 53 54 55 56 57 58 59 5A
0130: 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A
0140: 83 84 85 86 87 88 89 8A 92 93 94 95 96 97 98 99
0150: 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7
0160: B8 B9 BA C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5
0170: D6 D7 D8 D9 DA E1 E2 E3 E4 E5 E6 E7 E8 E9 EA F1
0180: F2 F3 F4 F5 F6 F7 F8 F9 FA FF C4 00 1F 01 00 03
0190: 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 01
01A0: 02 03 04 05 06 07 08 09 0A 0B FF C4 00 B5 11 00
01B0: 02 01 02 04 04 03 04 07 05 04 04 00 01 02 77 00
01C0: 01 02 03 11 04 05 21 31 06 12 41 51 07 61 71 13
01D0: 22 32 81 08 14 42 91 A1 B1 C1 09 23 33 52 F0 15
01E0: 62 72 D1 0A 16 24 34 E1 25 F1 17 18 19 1A 26 27
01F0: 28 29 2A 35 36 37 38 39 3A 43 44 45 46 47 48 49
0200: 4A 53 54 55 56 57 58 59 5A 63 64 65 66 67 68 69
0210: 6A 73 74 75 76 77 78 79 7A 82 83 84 85 86 87 88
0220: 89 8A 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6
0230: A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B8 B9 BA C2 C3 C4
0240: C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E2
0250: E3 E4 E5 E6 E7 E8 E9 EA F2 F3 F4 F5 F6 F7 F8 F9
0260: FA FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 E2
0270: E8 A2 8A F9 93 F7 10 A2 8A 28 00 A2 8A 28 00 A2
0280: 8A 28 03 FF D9

分 析:
0000-0001:FF D8(文件頭)
0002-0013:APP0段,其中:
0002-0003:FF E0(段 標記)
0004-0005:00 10(段長度=16字節)
0006-000A:4A 46 49 46 00(“JFIF”的 ASCII碼)
000B-000C:01 01(主次版本號=1.01)
000D     :01(密度單位爲 點數/英寸)
000E-0011:00 60 00 60(水平和垂直的密度均爲每英寸96像素)
0012-0013:00 00(沒有縮略圖)
0014-0058:DQT 段,其中:
0014-0015:FF DB(段標記)
0016-0017:00 43(段長度=67字節)
0018     :00(QT號=0,QT精度=8bit)
0019-0058:QT
0059-009D:DQT段,其中:
0059-005A:FF DB(段標記)
005B-005C:00 43(段長度=67字節)
005D     :01(QT號=1,QT精度=8bit)
005E-009D:QT
009E-00B0:SOF0段,其中:
009E-009F:FF C0(段標記)
00A0-00A1:00 11(段長度=17字節)
00A2     :08(樣 本精度=8bit)
00A3-00A6:00 18 00 20(圖像高=24,圖像寬=32)
00A7     :03(組件 數量=3,YCbCr彩色圖)
00A8     :01(ID號=1,這是亮度Y組件)
00A9     :22(化爲二進 制=00100010,表明垂直和水平採樣係數均=2)
00AA     :00(使用QT號=0的量化表)
00AB     :02(ID號=2,這是色度Cb組件)
00AC     :11(化爲二進制=00010001,表明垂直和水平採樣系 數均=1)
00AD     :01(使用QT號=1的量化表)
00AE     :03(ID號=3,這是色度Cr組件)
00AF     :11(化爲二進制=00010001,表明垂直和水平採樣係數均=1)
00B0     :01(使用QT號=1的量 化表)
00B1-00D1:DHT段,其中:
00B1-00B2:FF C4(段標記)
00B3-00B4:00 1F(段長度=31字節)
00B5     :00(HT號=0,DC表)
00B6-00C5:這 16個數字之和=12,說明下面的HT值表的長度=12字節)
00C6-00D1:HT值表
00D2-0188:DHT段,這是HT 號=0的AC表,參照上面分析
0189-01A9:DHT段,這是HT號=1的DC表,參照上面分析
01AA-0260:DHT段,這是 HT號=1的AC表,參照上面分析
0261-026E:SOS段,其中:
0261-0262:FF DA(段標記)
0263-0264:00 0C(段長度=12字節)
0265     :03(組件數量=3)
0266-0267:01 00(組件ID=1,Y組件,使用HT表號=0的AC表)
0268-0269:02 11(組件ID=2,Cb組 件,使用HT表號=1的DC表)
026A-026B:03 11(組件ID=3,Cr組件,使用HT表號=1的DC表)
026C-026E:00 3F 00(幾乎每個JPG文件中這3個字節的值都相同,但用途不明)
026F-0282:圖像壓縮數據
0283-0284:FF D9(文 件尾)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章