6.3 JPEG格式
6.3.1 簡介
微處理機中的存放順序有正序(big endian)和逆序(little endian)之分。正序存放就是高字節存放在前低字節在后,而逆序存放就是低字節在前高字節在后。例如,十六進制數為A02B,正序存放就是A02B,逆序存放就是2BA0。摩托羅拉(Motorola)公司的微處理器使用正序存放,而英特爾(Intel)公司的微處理器使用逆序。JPEG文件中的字節是按照正序排列的。
JPEG委員會在制定JPEG標準時,定義了許多標記(marker)用來區分和識別圖像數據及其相關信息,但筆者沒有找到JPEG委員會對JPEG文件交換格式的明確定義。直到1998年12月從分析網上具體的JPG圖像來看,使用比較廣泛的還是JPEG文件交換格式(JPEG File Interchange 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文件中的第一個圖像樣本是圖像左上角的樣本。
6.3.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 X and 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 |
圖像文件結束標記 |
posted on 2005-06-22 16:53
小米 閱讀(8748)
評論(7) 編輯 收藏 所屬分類:
其它