JPEG文件格式解析

JPEG文件格式解析

微處理機中的存放順序有正序(big endian)和逆序(little endian)之分。正序存放就是高字節存放在前低字節在後,而逆序存放就是低字節在前高字節在後。例如,十六進制數爲A02B,正序存放就是A02B,逆序存放就是2BA0。摩托羅拉(Motorola)公司的微處理器使用正序存放,而英特爾(Intel)公司的微處理器使用逆序。JPEG文件中的字節是按照正序排列的。

JPEG委員會在制定JPEG標準時,定義了許多標記(marker)用來區分和識別圖像數據及其相關信息,但筆者沒有找到JPEG委員會對JPEG文件交換格式的明確定義。直到1998年12月從分析網上具體的JPG圖像來看,使用比較廣泛的還是JPEG文件交換格式(JPEG FileInterchange Format,JFIF)版本號爲1.02。這是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外還有TIFF JPEG等格式,但由於這種格式比較複雜,因此大多數應用程序都支持JFIF文件交換格式。
JPEG文件使用的顏色空間是CCIR 601推薦標準進行的彩色空間(參看第7章)。在這個彩色空間中,每個分量、每個像素的電平規定爲255級,用8位代碼表示。從RGB轉換成YCbCr空間時,使用下面的精確的轉換關係:
       Y = 256 * E'y
      Cb = 256 * [E'Cb] + 128
      Cr = 256 * [E'Cr] + 128其中亮度電平E'y和色差電平E'Cb和E'Cb分別是CCIR 601定義的參數。由於E'y的範圍是0~1,E'Cb和E'Cb的範圍是-0.5~+0.5,因此Y, Cb和Cr的最大值必須要箝到255。於是RGB和YCbCr之間的轉換關係需要按照下面的方法計算。
(1) 從RGB轉換成YCbCr
YCbCr(256級)分量可直接從用8位表示的RGB分量計算得到:
       Y =   0.299 R + 0.587 G  + 0.114 B
     Cb = - 0.1687R - 0.3313G  + 0.5   B + 128
    Cr = 0.5 R - 0.4187G - 0.0813 B + 128
需要注意的是不是所有圖像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存儲樣本數據,因此在RGB文件轉換成JFIF文件時需要首先驗證RGB的次序。
(2) 從YCbCr轉換成RGB
RGB分量可直接從YCbCr(256級)分量計算得到:
     R = Y                 + 1.402 (Cr-128)
      G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
      B = Y + 1.772 (Cb-128)

在JFIF文件格式中,圖像樣本的存放順序是從左到右和從上到下。這就是說JFIF文件中的第一個圖像樣本是圖像左上角的樣本。
2文件結構
JFIF文件格式直接使用JPEG標準爲應用程序定義的許多標記,因此JFIF格式成了事實上JPEG文件交換格式標準。JPEG的每個標記都是由2個字節組成,其前一個字節是固定值0xFF。每個標記之前還可以添加數目不限的0xFF填充字節(fill byte)。下面是其中的8個標記:
SOI  0xD8            圖像開始
APP0 0xE0            JFIF應用數據塊
APPn 0xE1 - 0xEF    其他的應用數據塊(n, 1~15)
DQT  0xDB           量化表
SOF0 0xC0            幀開始
DHT  0xC4           霍夫曼(Huffman)表
SOS  0xDA           掃描線開始
EOI  0xD9            圖像結束
爲使讀者對JPEG定義的標記一目瞭然,現將JPEG的標記碼列於表6-05,並保留英文解釋。
表6-05 JPEG定義的標記
Symbol
(符號) Code Assignment
(標記代碼) Description
(說明)
Start Of Frame markers, non-hierarchical Huffman coding
SOF0 0xFFC0 Baseline DCT
SOF1 0xFFC1 Extended sequential DCT
SOF2 0xFFC2 Progressive DCT
SOF3 0xFFC3 Spatial (sequential) lossless
Start Of Frame markers, hierarchical Huffman coding
SOF5 0xFFC5 Differential sequential DCT
SOF6 0xFFC6 Differential progressive DCT
SOF7 0xFFC7 Differential spatial lossless
Start Of Frame markers, non-hierarchical arithmetic coding
JPG 0xFFC8 Reserved for JPEG extensions
SOF9 0xFFC9 Extended sequential DCT
SOF10 0xFFCA Progressive DCT
SOF11 0xFFCB Spatial (sequential) Lossless
Start Of Frame markers, hierarchical arithmetic coding
SOF13 0xFFCD Differential sequential DCT
SOF14 0xFFCE Differential progressive DCT
SOF15 0xFFCF Differential spatial Lossless
Huffman table specification
DHT 0xFFC4 Define Huffman table(s)
arithmetic coding conditioning specification
DAC 0xFFCC Define arithmetic conditioning table
Restart interval termination
RSTm 0xFFD0~0xFFD7 Restart with modulo 8 counter m
Other marker
SOI 0xFFD8 Start of image
EOI 0xFFD9 End of image
SOS 0xFFDA Start of scan
DQT 0xFFDB Define quantization table(s)
DNL 0xFFDC Define number of lines
DRI 0xFFDD Define restart interval
DHP 0xFFDE Define hierarchical progression
EXP 0xFFDF Expand reference image(s)
APPn 0xFFE0~0xFFEF Reserved for application use
JPGn 0xFFF0~0xFFFD Reserved for JPEG extension
COM 0xFFFE Comment
Reserved markers
TEM 0xFF01 For temporary use in arithmetic coding
RES 0xFF02~0xFFBF Reserved
JPEG文件由下面的8個部分組成:
(1) 圖像開始SOI(Start of Image)標記
(2) APP0標記(Marker)
① APP0長度(length)
② 標識符(identifier)
③ 版本號(version)
④ X和Y的密度單位(units=0:無單位;units=1:點數/英寸;units=2:點數/釐米)
⑤ X方向像素密度(X density)
⑥ Y方向像素密度(Y density)
⑦ 縮略圖水平像素數目(thumbnail horizontal pixels)
⑧ 縮略圖垂直像素數目(thumbnail vertical pixels)
⑨ 縮略圖RGB位圖(thumbnail RGB bitmap)
(3) APPn標記(Markers),其中n=1~15(任選)
① APPn長度(length)
② 由於詳細信息(application specific information)
(4) 一個或者多個量化表DQT(difine quantization table)
① 量化表長度(quantization table length)
② 量化表數目(quantization table number)
③ 量化表(quantization table)
(5) 幀圖像開始SOF0(Start of Frame)
① 幀開始長度(start of frame length)
② 精度(precision),每個顏色分量每個像素的位數(bits per pixel per color component)
③ 圖像高度(image height)
④ 圖像寬度(image width)
⑤ 顏色分量數(number of color components)
⑥ 對每個顏色分量(for each component)
ID
垂直方向的樣本因子(vertical sample factor)
水平方向的樣本因子(horizontal sample factor)
量化表號(quantization table#)
(6) 一個或者多個霍夫曼表DHT(Difine Huffman Table)
① 霍夫曼表的長度(Huffman table length)
② 類型、AC或者DC(Type, AC or DC)
③ 索引(Index)
④ 位表(bits table)
⑤ 值表(value table)
(7) 掃描開始SOS(Start of Scan)
① 掃描開始長度(start of scan length)
② 顏色分量數(number of color components)
③ 每個顏色分量
ID
交流係數表號(AC table #)
直流係數表號(DC table #)
④ 壓縮圖像數據(compressed image data)
(8) 圖像結束EOI(End of Image)
表6-06表示了APP0域的詳細結構。有興趣的讀者可通過UltraEdit或者PC TOOLS等工具軟件打開一個JPG圖像文件,對APP0的結構進行分析和驗證。
表6-06 JFIF格式中APP0域的詳細結構
偏移 長度 內容 塊的名稱 說明
0 2 byte 0xFFD8 (Start of Image,SOI) 圖像開始
2 2 byte 0xFFE0 APP0(JFIF application segment) JFIF應用數據塊
4 2 bytes   length of APP0 block APP0塊的長度
6 5 bytes   "JFIF"+"0" 識別APP0標記
11 1 byte   <Major version> 主要版本號(如版本1.02中的1)
12 1 byte   <Minor version> 次要版本號(如版本1.02中的02)
13 1 byte   <Units for the Xand Y densities> X和Y的密度單位
units=0:無單位
units=1:點數/英寸
units=2:點數/釐米
14 2 bytes   <Xdensity> 水平方向像素密度
16 2 bytes   <Ydensity> 垂直方向像素密度
18 1 byte   <Xthumbnail> 縮略圖水平像素數目
19 1 byte   <Ythumbnail> 縮略圖垂直像素數目
  3n   < Thumbnail RGB bitmap> 縮略RGB位圖(n爲縮略圖的像素數)
      Optional JFIF extension APP0 marker segment(s) 任選的JFIF擴展APP0標記段
  ……   ……  
  2 byte 0xFFD9 (EOI) end-of-file 圖像文件結束標記
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章