Jpeg的檔案資訊

smilestone322發表於2016-03-01

JPEG檔案的格式是分為一個一個的段來儲存的(但並不是全部都是段),段的多少和長度並不是一定的。只要包含了足夠的資訊,該JPEG檔案就能夠被開啟,呈現給人們。JPEG檔案的每個段都一定包含兩部分一個是段的標識,它由兩個位元組構成:第一個位元組是十六進位制0xFF,第二個位元組對於不同的段,這個值是不同的。緊接著的兩個位元組存放的是這個段的長度(除了前面的兩個位元組0xFF和0xXX,X表示不確定。他們是不算到段的長度中的)。注意:這個長度的表示方法是按照高位在前,低位在後的。與Intel的表示方法不同。比方說一個段的長度是0x12AB,那麼它會按照0x12,0xAB的順序儲存。但是如果按照Intel的方式:高位在後,低位在前的方式會儲存成0xAB,0x12,而這樣的儲存方法對於JPEG是不對的。這樣的話如果一個程式不認識JPEG檔案某個段,它就可以讀取後兩個位元組,得到這個段的長度,並跳過忽略它。

       0xFFXX又可稱為標記碼,絕大多數的JPEG檔案只包含以下幾種:

       SOI 0xD8 (影象開始,start of image,可作為JPEG格式的判斷,JFIF還需要APP0的配合);

       APP00xE0 (JFIF應用資料塊,APP0JPEG保留給Application所使用的標記碼,而JFIF將檔案的相關資訊定義在此標記中)

       Appn0xE1-0xEF,其它的應用資料塊(n ,1-15)

       DQT0xDB  ,量化表

       SOF00xC0 ,幀開始

       DHT0xC4Huffman

       SOS0xDA 掃描線開始,start of scan

       EOI0xD9,影象結束,end of image

 

 

上面截圖是jpg影象的檔案頭資訊,使用ulTraEdit讀取,下面根據jpeg的標記和上面截圖一起分析jpeg的檔案頭:

1)影象的開始SOIstart of image)標記

就是截圖中的開始兩個位元組FF D8

 

2APP0標記(Marker)

對應截圖中的FF E0

2.1APP0 長度,2個位元組,對應截圖中的 00 10,及長度為16個位元組,該長度不包括FF E0,但包括00 10這兩個位元組;

2.2)識別符號(identifier)

       5個位元組,JFIF識別碼,對應截圖中的0x4A0x460x490x46,0x00

2.3 版本號

       接下來的兩個位元組表示版本號,可以為0101,或0x0102;在上圖中為0x0101,為JFIF版本號

2.4 XY的密度單位

   1個位元組,units=0,無單位;units=1;點數,英寸;units=2;點數/釐米;

上圖中為0,表示無單位;

2.5 X方向的畫素密度

   2個位元組表示水平解析度,上圖中為0x012c,轉化為10進位制,為300

2.6 Y方向的畫素密度

       2個位元組,表示垂直解析度;上圖中為0x012c,轉化為10進位制,為300

2.7)縮放圖水平畫素的數目;

       1個位元組,對應圖中0x00

2.8)縮放圖垂直畫素數目;

       1個位元組,對應圖中0x00

2.9)縮放圖RGB點陣圖

       3個位元組,表示縮放圖RGB點陣圖,上圖中沒有該欄位

 

3)一個或多個量化表DQT(define quantization table)

       標記為0xFF DB

3.1)量化表長度

       2個位元組,DQT標記碼長度,不包括前2個位元組0xFF0xDB,從上圖可以看出該量化表的長度為0x0043 ,即67個位元組;

3.2)量化表的數目;

       (Pq,Tq):1位元組,它的高4Pq為量化表的資料精度,Pq=0時,表示8位;當Pq=1時,Qt的值為16bitTq表示量化表的編號,為0-3。在基本系統中,Pq=0Tq=0-1,即最多有兩個量化表;對應上圖;量化表的資料對應位元組為0x00,即是8bit的第0個量化表

      

3.3)量化表(quantization table)

       Q0-Q63,Pq=0時,每一個Qn用一個位元組表示;當Pq=1;用兩個位元組表示,在上圖中,用一個位元組表示;

       從上圖中提取量化表(亮度量化表)如下:

      

10

0B

0C

0E

0C

0A

10

0E

0D

0E

12

11

10

13

18

28

1A

18

16

16

18

31

23

25

1D

28

3A

33

3D

3C

39

33

38

37

40

48

5C

4E

40

44

57

45

37

38

50

6D

51

57

5F

62

67

68

67

3E

4D

71

79

70

64

78

5C

65

67

63

 

    接著又是0xFFDB,即接下來的段又是一個量化表;量化表的長度還是67個位元組,量化表的數目為0x01,即是第一個量化表;下面直接給出第2個量化表,即色度量化表;

      

11

12

12

18

15

18

2F

1A

1A

2F

63

42

38

42

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

63

 

4 幀影象開始SOFstart of Frame

 

       幀影象開始標記為:0xFF 0xC0

4.1)幀開始長度(start of frame length)

       兩個位元組,上圖中為0x0011,即17個位元組;包括它本身;

 

4.2)精度,每個顏色分量每個畫素的位數,一個位元組,基本系統中,為0x08

      

4.3)影象的高度(image height)

       2個位元組,對應圖中為0x00B1 對應10進製為177,即對應的高為177

 

4.4)影象的寬度

       2個位元組,對應圖中為0x01E6 ;對應10進製為486,即影象的寬為486,得到影象的分別率為486*177

 

4.5)顏色分量數

       1位元組,1表示灰度圖,3表示真彩圖;上圖中該欄位=3,為真彩圖;

 

4.6)對每個顏色分量(for each component

       ID號,一個位元組;

垂直方向的樣本因子;

水平方向的樣本因子;

量化表號(quantization table#)

 

01 22 00 02 11 01 03 11 01

 

分別表示3個分量;

01 22 00 表示第1個分量,ID號為01 ,垂直方向的樣本因子為2,水平也為2 量化表=0,即採用亮度量化表;2,第3個分量採用色度量化表,從這個顏色分量可以看出為YUV411的格式;

 

5)一個或多個huffman

       0xFF C4

5.1huffman表的長度;

       兩個位元組,不包括前面的兩個位元組,在截圖中長度為0x001B

5.2huffman型別,ACDC

       一個位元組長度,(Tc,Th),Tc為高4bitTh為低4bit。在基本系統中,Tc01,為0時,指DC所用的huffman表,為1時,指AC所用的Huffman表。Th表示Huffman表的編號,在基本系統中,其值為01。在截圖中該欄位為0x00;即該huffmanDCHuffman表。該huffman表的有效長度為27-3=24個位元組;

24個位元組分為Ln n=1-16;Ln表示每個nbitHuffman碼字的個數;

Vt表示每個Huffman碼字所對應的值,對於DC來說該值為(Size),對於AC來說為(RunLengthSize)。t=L1+L2+…+L16,即t=01+02+03+01+01=08,所以總長度為24

 

1)  掃描開始SOSstart of Scan

起始為0xFFDA兩個位元組,然後接著就是長度,長度2個位元組,截圖中的長度為0x000c;即為12個位元組;

 

① 掃描開始長度(start of scan length)    //對應0x000C
② 顏色分量數(number of color components)  //對應0x03
③ 每個顏色分量
o ID
o 交流係數表號
(AC table #)
o 直流係數表號(DC table #)

 

01 00 02 11 03 11 表示3個分量,第一個分量的交直流引數對應項為0x00,即表示DC編碼表編號為0AC編碼編碼表的編號為0

相關文章