1. JPEG格式文件簡介
1.1 拓展名.jpg與.jpeg
JPEG的文件格式一般有兩種文件擴展名:.jpg和.jpeg,這兩種擴展名的實質是相同的,我們可以把.jpg的文件改名為.jpeg,而對文件本身不會有任何影響。嚴格來講,JPEG的文件擴展名應該為.jpeg,由於DOS時代的8.3文件名命名原則,就使用了.jpg的擴展名,這種情況類似於.htm和.html的區別。
1.2 JPEG的三種格式
JPEG格式可以分為:標准JPEG、漸進式JPEG 和 JPEG2000三種格式。
-
標准JPEG:
該類型的圖片文件,在網絡上應用較多,只有圖片完全被加載和讀取完畢之后,才能看到圖片的全貌;它是一種很靈活的圖片壓縮方式,用戶可以在壓縮比和圖片品質之間進行權衡。不過通常來講,其壓縮比在10:1到40:1之間,壓縮比越大,品質就越差,壓縮比越小,品質就越好。
-
漸進式JPEG:
該類型的圖片是對標准JPEG格式的改進,當在網頁上下載漸進式JPEG圖片時,首先呈現圖片的大概外貌,然后再逐漸呈現具體的細節部分,因而被稱之為漸進式JPEG。
-
JPEG2002:
一種全新的圖片壓縮發,壓縮品質更好,並且改善了無線傳輸時,因信號不穩定而造成的馬賽克及位置錯亂等問題。另外,作為JPEG的升級版,JPEG2000的壓縮率比標准JPEG高約30%,同時支持有損壓縮和無損壓縮。它還支持漸進式傳輸,即先傳輸圖片的粗略輪廓,然后,逐步傳輸細節數據,使得圖片由模糊到清晰逐步顯示。
2. JPEG文件結構詳解
2.1 JPEG圖片格式組成部分
JPEG格式的文件是分為一個一個的段來存儲的,段的多少和長度並不是一定的。只要包含了足夠的信息,該JPEG文件就能夠被打開,呈現給人們。但JPEG文件的每個段都一定包含兩部分:
1. 段的標識與類型。它由兩個字節構成:第一個字節是段標識0xFF,第二個字節是段類型(對於不同的段是不同的),具體如以下表:
段類型 表示符號 說明
——————————————————————————————————
SOI D8 文件頭
APP0 E0 定義交換格式和圖像識別信息
APP1 E1 同上
.... .... ....
APPn En 同上
DQT DB 定義量化表
SOF0 C0 圖像基本信息
SOF1 C1 同上
.... .... ....
SOFn Cn 同上
DHT C4 定義 Huffman 表(霍夫曼表)
DRI DD 定義重新開始間隔
SOS DA 掃描行開始
COM FE 注釋
EOI D9 文件尾
......
2. 段的長度。緊接着的兩個字節存放的是這個段的長度(除了前面的兩個字節0xFF和0xXX,X表示不確定。他們是不算到段的長度中的)。其作用是這樣的話如果一個程序不認識JPEG文件某個段,它就可以讀取后兩個字節,得到這個段的長度,並跳過忽略它。
注意:這個長度的表示方法並不是按照傳統intel的方法(低位在前,高位在后,即逆序),而是按照高位在前,低位在后的。比方說一個段的長度是0x12AB,那么它會按照0x12,0xAB的順序存儲。但是如果按照Intel的方式:高位在后,低位在前的方式會存儲成0xAB,0x12,而這樣的存儲方法對於JPEG是不對的。
綜上,以下是jpeg圖片的段的一般結構:
-----------------------------------------------------------------
名稱 字節數 數據 說明
-----------------------------------------------------------------
段標識 1 FF 每個新段的開始標識
段類型 1 段類型編碼(稱作“標記碼”)
段長度 2 包括段內容和段長度本身,不包括段標識和段類型
段內容 ≤65533字節
注意:
-
有些段沒有長度描述也沒有內容,只有段標識和段類型。文件頭和文件尾均屬於這種段。
-
段與段之間無論有多少FF都是合法的,這些FF稱為“填充字節”,必須被忽略掉。
2.2 段類型
段類型有30種,以下列出幾種必須的或常見的 JPEG文件段類型。
-
SOI(必須):SOI段定義了文件頭。該段僅有兩個字節:FF D8,這兩個字節代表了JPEG文件的開始。
-
APP0, APP1, APP2....(必須):APP0段定義了交換格式和圖像識別信息。包含了一些像素和略縮圖相關的信息。
-
DQT(必須):DQT段定義了量化表。JPEG文件一般有兩個DQT段,為亮度定義1個, 為色度定義1個。
-
SOF0, SOF1, SOF2....(必須):SOF段定義了圖像基本信息。包含了一些圖片長寬高、組件等信息。
-
DHT(必須) :DHT段定義了Huffman表,即霍夫曼編碼表。
-
DRI(非必須):DRI段定義了重新開始間隔,很多JPEG文件沒有這個段。
-
SOS(必須):SOS段定義了掃描行開始,緊接着SOS段后的就是一個個掃描行(壓縮的圖像數據)。
-
COM(非必須):COM段定義了注釋段,有的JPEG文件沒有這個段。
-
EOI(必須):EOI段定義了文件尾,該段僅有兩個字節:FF D9,這兩個字節代表了JPEG文件的結束。
-
