MPO文件類型解碼(三)瞭解JPEG數據結構

JPEG的數據結構

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     註釋。

3.以下按一般JPEG文件的段排列順序詳細介紹各種段的結構:
SOI(文件頭)
名稱  字節數   值
段標識   1     FF
段類型   1     D8 
  說明:這兩個字節構成了JPEG文件頭。
APP0(圖像識別信息)
--------------------------------------------------------------------------
名稱       字節數 值          說明
--------------------------------------------------------------------------
段標識        1   FF
段類型        1   E0
段長度        2   0010        如果有RGB縮略圖就=163n
  (以下爲段內容)
交換格式      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像素
--------------------------------------------------------------------------
  說明:
①JFIFJPEG File Interchange Format的縮寫,即JPEG文件交換格式,另外還有TIFF等格式,很少用
②“如果有RGB縮略圖就=163n”是什麼意思呢?比如說縮略圖X像素縮略圖Y像素的值均爲48,就表示有一個48×48像素的縮略圖(n=48×48),縮略圖是24位真彩位圖,用3個字節來表示一個像素,所以共佔用3n個字節。但大多數JPG文件都沒有這個雞肋縮略圖。
COM(註釋)
--------------------------------------------------------------------------
名稱    字節數   值    說明
--------------------------------------------------------------------------
段標識    1      FF
段類型    1      FE
段長度    2            其值=註釋字符的字節數+2
段內容                 註釋字符
-----------------------------------------說明:有的JPEG文件沒有這個段。
DQT(定義量化表)

--------------------------------------------------------------------------
名稱    字節數   值    說明
--------------------------------------------------------------------------
段標識    1      FF
段類型    1      DB
段長度    2      43    其值=3n(當只有一個QT時)
  (以下爲段內容)
QT信息    1            03位:QT
                       47位:QT精度(08bit1字節;否則=16bit2字節)
QT        n            n64×QT精度的字節數
--------------------------------------------------------------------------說明:
①JPEG文件一般有2個DQT段,爲Y值(亮度)定義1個C值(色度)定義1個。 
一個DQT段可以包含多個QT, 每個都有自己的信息字節
SOF0(圖像基本信息)
--------------------------------------------------------------------------
名稱  字節數   值    說明
--------------------------------------------------------------------------
段標識   1     FF
段類型   1     C0
段長度   2           其值=8+組件數量×3
  (以下爲段內容)
樣本精度  1    8     每個樣本位數(大多數軟件不支持1216
圖片高度  2
圖片寬度  2
組件數量  1    3     1=灰度圖,3YCbCr/YIQ 彩色圖,4CMYK 彩色圖
  (以下每個組件佔用3字節)
組件 ID   1          1Y, 2Cb, 3Cr, 4I, 5Q
採樣係數  1          03位:垂直採樣係數
                     47位:水平採樣係數
量化表號  1
--------------說明:
①JPEG大都採用yCrCb色彩模型(y表示亮度,Cr紅色分量,Cb表示藍色分量),所以組件數量一般=3
樣本就是單個像素的顏色分量,也可理解爲一個樣本就是一個組件
採樣係數是實際採樣方式與最高採樣係數之比,而最高採樣係數一般=0.5(分數表示爲1/2)。比如說,垂直採樣係數=2,那麼2×0.51,表示實際採樣方式是每個點採一個樣,也就是逐點採樣;如果垂直採樣係數=1,那麼:1×0.50.5(分數表示爲1/2),表示每2個點採一個樣
DHT(定義Huffman表)
--------------------------------------------------------------------------
名稱    字節數   值    說明
--------------------------------------------------------------------------
段標識    1      FF
段類型    1      C4
段長度    2            其值=19n(當只有一個HT表時)
  (以下爲段內容)
HT信息    1            03位:HT
                       4位:   HT類型, 0DC表,1AC
            57位:必須=0
HT位表    16           16個數的和應該≤256
HT值表    n            n=表頭16個數的和
----說明:
①JPEG文件裏有2類Haffman 表:一類用於DC(直流量),一類用於AC(交流量)。一般有4個表:亮度的DCAC,色度的DCAC。最多可有6個。
一個DHT 段可以包含多個HT每個都有自己的信息字節
③HT表是一個按遞增次序代碼長度排列的符號表。
DRI(定義重新開始間隔)
--------------------------------------------------------------------------
名稱    字節數   值    說明
--------------------------------------------------------------------------
段標識    1      FF
段類型    1      DD
段長度    2      4 
  (以下爲段內容)
開始間隔  2      n    復位標記的間隔距離
---------說明:
開始間隔表示在壓縮數據流中,每隔n個MCU 塊就有一個RST標記,RST標記將Huffman 的解碼數據流復位,DC也重新從0開始,因此,RST標記是一種復位標記
②RST 標記是一種特殊的段,它只具有段標識和段類型(長度=2字節),但它不是獨立的段,只能穿插在數據流中(文件頭和文件尾段也只有段標識和段類型,卻都是獨立的段)。
③RST標記共有8個(RST0RST7),從RST0起開始使用,然後是RST1....直至RST7,再從RST0重複。
④RST標記的標識碼是 FFD0FFD7,對應 RST0RST7
筆者查看了許多自己電腦上的JPG文件的數據,未發現DRI段和RST標記,所以無法進行詳盡的考察

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

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

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

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