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 圖像文件結束標記
JPEG文件格式解析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Linux---find文件查找命令
zhongqijian916
2019-02-23 13:54:50
雙系統啓動boot.ini文件的祕密
czq2008sky
2019-02-23 13:43:30
組策略之(4)-------可移動存儲的文件保護(只讀設置)
czq2008sky
2019-02-23 13:43:29
find -exec -ok 的用法 -mtime
781732825
2019-02-23 13:43:17
python 輸入 和文件操作
戰神tian
2019-02-23 13:42:53
組策略之(3)-------用戶文件重定向
czq2008sky
2019-02-23 13:38:34
JavaScript input type=file 獲取文件大小及類型限制
wangyong191212
2019-02-23 13:37:47
Lotus Notes 歸檔文件恢復
菜鳥小苗
2019-02-23 13:31:29
恢復FAT16文件—誤刪除
zhanglong0123
2019-02-23 13:27:42
CISCO路由器/交換機的配置文件備份及還原
zhanglong0123
2019-02-23 13:27:42
幾個重要的Linux系統內核文件介紹
圍剿V風捲
2019-02-23 13:15:32
Linux下文件的壓縮與解壓縮命令詳解
smallCrab2009
2019-02-23 13:10:25
LINUX配置文件
smallCrab2009
2019-02-23 13:10:25
Nginx配置文件中文註釋詳解
veryfool
2019-02-23 12:54:46
SILKYPIX JPEG Photography 9E for Mac(圖像處理軟件)
poyiboji
2019-02-23 13:50:03