jpg 格式舉例詳解

http://blog.csdn.net/yangysng07/article/details/9025443

 

 

JPEG文件數據結構以及將位圖保存爲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文件沒有這個段。

 

表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(文件尾)

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