概述,簡介,檔案結構,檔案組成部分,概述,圖像開始SOI(Start of Image)標記,APP0標記(Marker),APPn標記(Markers),一個或者多個量化表DQT,一個或者多個霍夫曼表DHT,定義重新開始間隔DRI,掃描開始SOS,圖像結束EOI,
概述
圖片存儲格式之一,由
JPEG格式衍生而來,後綴為".jfif"。
JPEG本身只有描述如何將一個圖像轉換為
位元組的數據串流(streaming),但並沒有說明這些位元組如何在任何特定的儲存媒體上被封存起來。一個由獨立JPEG小組(Independent JPEG Group)所建立的額外標準,稱為JFIF(JPEG File Interchange Format,JPEG檔案交換格式),詳細說明如何從一個JPEG串流,產出一個適合於電腦儲存和傳輸(像是在網際網路上)的檔案。當有人稱呼一個"JPEG檔案",一般而言他是意指一個JFIF檔案,或有時候是一個Exif JPEG檔案。然而,也有其他以
JPEG為基礎的檔案格式,像是JNG。
JPEG/JFIF是最普遍在
全球資訊網(World Wide Web)上被用來儲存和傳輸圖片的格式。它並不適合於線條繪圖(drawing)和其他文字或圖示(iconic)的圖形,因為它的壓縮方法用在這些圖形的型態上,會得到不適當的結果(
PNG和
GIF格式通常是用來針對這種目的之圖形;GIF每一像素只有8位元,並不很適合於用在彩色照片,PNG可以被用來無失真地儲存照片,但是檔案太大讓它不適合在網頁上放照片)。
對於JFIF的
MIME媒體型態是image/
jpeg(定義在RFC 1341)。
簡介
微處理機中的數據存放順序有
大端(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檔案使用的
顏色空間是
YCbCr空間。在JFIF檔案格式中,圖像樣本的存放順序是從左到右和從上到下。這就是說JFIF檔案中的第一個圖像樣本是圖像左上角的樣本。
檔案結構
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 圖像結束
檔案組成部分
概述
一般的JFIF檔案由下面的9個部分組成:
圖像開始SOI(Start of Image)標記
APP0標記(Marker)
① APP0長度(length)(①~⑨九個欄位的總長度)
2h 2位元組內容不定(①~⑨九個欄位的總長度)
② 標識符(identifier)
4h 5位元組 0x4A46494600 即“JFIF0”
③ 版本號(version)
9h 2位元組 0x0102 JFIF的版本號目前基本上都是1.2
④ X和Y的密度單位(units=0:無單位;units=1:點數/英寸;units=2:點數/厘米)
bh 1位元組只有0,1,2三個值可選,其分別代表的意義如上]
⑤ X方向像素密度(X density)
ch 2位元組取值範圍未知
⑥ Y方向像素密度(Y density)
eh 2位元組取值範圍未知
⑦ 縮略圖水平像素數目(thumbnail horizontal pixels)
10h 1位元組取值範圍未知
⑧ 縮略圖垂直像素數目(thumbnail vertical pixels)
11h 1位元組取值範圍未知
⑨ 縮略圖RGB
點陣圖(thumbnail RGB bitmap)
12h 長度可能是3的倍數內容不定
本段(APP0)可以包含圖像的一個微縮版本,存為24位的RGB像素。如果沒有微縮圖像(這種情況更常見),則⑦“縮略圖水平像素數目”和⑧“縮略圖垂直像素數目”的值均為0。
APPn標記(Markers)
① APPn長度(length)(①②兩個欄位的總長度)
② 詳細信息(application specific information)
對每個APP:
若為APPN(N=1~F(以16進制表示,N任選其中一個))
· 長度:(m+2)h 2位元組內容不定(設為n(10進制))(本欄位與下一欄位的總長度)
· 詳細信息: (m+4)h n-2位元組(即長度減2)內容不定
一個或者多個量化表DQT
DQT(Difine Quantization Table)
0h 2位元組 0xFFDB
① 量化表長度(quantization table length)(①~②兩個欄位的總長度)
2h 2位元組內容不定(①~②兩個欄位的總長度)
② 量化表(quantization table)
A. P/T(高四位:精度,低四位:表ID)
B. 表項
對每個量化表:
· P/T(高四位:精度,低四位:表ID) mh 1
位元組精度, 0 表示 8 bit, 1表示 16 bit;ID取值範圍為0~3, 否則錯誤
· 表項 (m+1)h (64×(精度+1))位元組內容長,故略
(5) 幀圖像開始SOF0(Start of Frame)
0h 2位元組 0xFFC0
① 幀開始長度(start of frame length) (①~⑥六個欄位的總長度)
2h 2位元組內容不定(①~⑥六個欄位的總長度)
② 精度(precision),每個顏色分量每個像素的位數(bits per pixel per color component)
4h 1
位元組每個樣本位數, 通常是 8 (大多數軟體不支持 12 和 16)
③ 圖像高度(image height) 5h 2位元組內容不定(如果不支持 DNL 就必須 >0)
④ 圖像寬度(image width) 7h 2位元組內容不定(如果不支持 DNL 就必須 >0)
⑤ 顏色分量數(number of color components)
9h 1位元組內容不定(
灰度圖是 1, YCbCr/YIQ 彩色圖是 3, CMYK 彩色圖是 4,我們這裡討論的JFIF使用的是
YCbCr,故這裡顏色分量數為3)
⑥ 對每個顏色分量(for each component)
A. ID
B. 垂直方向的樣本因子(vertical sample factor)
C. 水平方向的樣本因子(horizontal sample factor) B、C共占用1
位元組,B占用低4位,C占用高4位)
D. 量化表號(quantization table#)
JFIF格式使用的是
YCbCr所以有3個分量(這裡特別要注意的是顏色分量的ID號是有含義的,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):
1) ID
ah 1位元組 0x01
(高四位)水平(低四位)垂直樣本因子
bh 共1位元組 0x227
量化表號
ch 1位元組內容不定(本分量使用的量化表的ID號)
2) ID
(高四位)水平(低四位)垂直樣本因子
eh 共1位元組 0x11J
量化表號
fh 1位元組內容不定(本分量使用的量化表的ID號)
3) ID
10h 1位元組 0x03
(高四位)水平(低四位)垂直樣本因子
11h 共1位元組 0x11
量化表號
12h 1位元組內容不定(本分量使用的量化表的ID號)
一個或者多個霍夫曼表DHT
DHT (Difine Huffman Table)
0h 2位元組 0xFFC4
① 霍夫曼表的長度(Huffman table length) (①~②兩個欄位的總長度)
2h 2位元組內容不定(①~②兩個欄位的總長度)
② 對每個霍夫曼表(一般情況下,霍夫曼表不止一個,但是絕對不多於4個)
A. 表號
B. 類型:AC或者DC(其中0:DC表,1:AC表);A、B共占用1
位元組,A占用低4位,B占用高4位)
C. 長16個位元組的編碼,其代碼代數和為接下來的編碼的長度
D. 內容編碼
對每個霍夫曼表:
·(高四位)類型和(低四位)表號: mh 共1位元組內容不定(有四個可能:0x00表示第0個DC表,0x01表示第1個DC表,0x10表示第0個AC表,0x11表示第1個AC表)
· 長16個
位元組的編碼: (m+1)h 16位元組內容不定(設這16個位元組上數據之和為n)
· 內容編碼: (m+17)h n位元組內容長,故略)
定義重新開始間隔DRI
DRI (Define Restart Interval)
(在沒有DRI標記,或間隔為零時,就不存在重新開始間隔和重開始標記)
0h 2位元組 0xFFDD
① 長度 2h 2位元組 0x0004(①~②兩個欄位的總長度)
② MCU 塊的單元中的重新開始間隔
4h 2
位元組內容不定(設為n,則意思是說,每n個MCU塊就有一個RSTn標記。第一個標記是RST0,然後是RST1等,RST7後再從RST0重複)
掃描開始SOS
SOS(Start of Scan)
0h 2位元組 0xFFDA
① 掃描開始長度(start of scan length)
2h 2位元組內容不定(①~③再加上④的A\B\C的總長度)
② 顏色分量數(number of color components)
4h 1
位元組應該和⑸⑤的值相同(
灰度圖是1, YCbCr/YIQ 彩色圖是3, CMYK 彩色圖是4)
③ 每個顏色分量
A. ID
B. 交流係數表號(AC table #)
C. 直流係數表號(DC table #)
(B、C共占用1位元組,B:占用低4位,C:占用高4位)
由②得到這裡的顏色分量數為3(這裡的顏色分量的ID號的含義和⑸⑥的一樣,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):
1) ID
5h 1
位元組 0x01 (高四位)直流(低四位)交流數表號
6h 共1位元組 0x00
2) ID
7h 1位元組 0x027 (高四位)直流(低四位)交流數表號
8h 共1位元組 0x11
3) ID
9h 1位元組 0x03 (高四位)直流(低四位)交流數表號
ah 共1位元組 0x11
④ 壓縮圖像數據(compressed image data)
A. 譜選擇開始 bh 1位元組 0x00
C. 兩個4
位欄位,高位和低位的譜選擇 dh 1位元組在基本JPEG中總為0x00
D. 數據 eh 長度不定內容長,故略
圖像結束EOI
EOI (End of Image)
0h 2位元組 0xFFD9