1. 程式人生 > >PNG,JPEG,BMP,JIF圖片格式詳解及其對比

PNG,JPEG,BMP,JIF圖片格式詳解及其對比

圖片格式詳解
不知道大家有沒有注意過網頁裡,手機裡,平板裡的圖片,事實上,圖片格式多樣,不同平臺對不同格式的圖片支援也不一樣,所以需要根據不同場合,使用不同格式的圖片。
一.PNG格式
行動式網路圖形(Portable Network Graphics,PNG)是一種無失真壓縮的點陣圖圖形格式,支援索引、灰度、RGB三種顏色方案以及Alpha通道等特性。

PNG格式有8位、24位、32位三種形式,其中8位PNG支援兩種不同的透明形式(索引透明和alpha透明),24位PNG不支援透明,32位PNG在24位基礎上增加了8位透明通道,因此可展現256級透明程度。

PNG8和PNG24後面的數字則是代表這種PNG格式最多可以索引和儲存的顏色值。”8″代表2的8次方也就是256色,而24則代表2的24次方大概有1600多萬色。

格式 最高支援色彩通道 索引色編輯支援 透明支援
PNG8 256索引色 支援 支援設定特定索引色為透明色(布林透明)
支援為索引色附加8位透明度(256階alpha透明)
PNG24 約1600萬色 不支援 不支援
PNG32 約1600萬色 不支援 支援8位透明度(256階alpha透明)

1.PNG的檔案結構

對於一個PNG檔案來說,其檔案頭總是由位固定的位元組來描述的:

進位制 編碼
十六進位制數 89 50 4E 47 0D 0A 1A 0A

其中第一個位元組0x89超出了ASCII字元的範圍,這是為了避免某些軟體將PNG檔案當做文字檔案來處理。檔案中剩餘的部分由3個以上的PNG的資料塊(Chunk)按照特定的順序組成,因此,一個標準的PNG檔案結構應該如下:

PNG檔案標誌 | PNG資料塊 …… | PNG資料塊

2.PNG資料塊(Chunk)

PNG定義了兩種型別的資料塊,一種是稱為關鍵資料塊(critical chunk),這是標準的資料塊,另一種叫做輔助資料塊(ancillary chunks),這是可選的資料塊。關鍵資料塊定義了4個標準資料塊,每個PNG檔案都必須包含它們,PNG讀寫軟體也都必須要支援這些資料塊。雖然PNG檔案規範沒有要求PNG編譯碼器對可選資料塊進行編碼和譯碼,但規範提倡支援可選資料塊。

下表就是PNG中資料塊的類別,其中,關鍵資料塊部分我們使用_字首加以區分。

資料塊符號 資料塊名稱 多資料塊 可選否 位置限制
_IHDR 檔案頭資料塊 第一塊
cHRM 基色和白色點資料塊 在PLTE和IDAT之前
gAMA 影象γ資料塊 在PLTE和IDAT之前
sBIT 樣本有效位資料塊 在PLTE和IDAT之前
_PLTE 調色盤資料塊 在IDAT之前
bKGD 背景顏色資料塊 在PLTE之後IDAT之前
hIST 影象直方圖資料塊 在PLTE之後IDAT之前
tRNS 影象透明資料塊 在PLTE之後IDAT之前
oFFs (專用公共資料塊) 在IDAT之前
pHYs 物理畫素尺寸資料塊 在IDAT之前
sCAL (專用公共資料塊) 在IDAT之前
_IDAT 影象資料塊 與其他IDAT連續
tIME 影象最後修改時間資料塊 無限制
tEXt 文字資訊資料塊 無限制
zTXt 壓縮文字資料塊 無限制
fRAc (專用公共資料塊) 無限制
gIFg (專用公共資料塊) 無限制
gIFt (專用公共資料塊) 無限制
gIFx (專用公共資料塊) 無限制
_IEND 影象結束資料 最後一個數據塊

為了簡單起見,我們假設在我們使用的PNG檔案中,這4個數據塊按以上先後順序進行儲存,並且都只出現一次。

(1)IHDR
檔案頭資料塊IHDR(header chunk):它包含有PNG檔案中儲存的影象資料的基本資訊,並要作為第一個資料塊出現在PNG資料流中,而且一個PNG資料流中只能有一個檔案頭資料塊。

檔案頭資料塊由13位元組組成,它的格式如下表所示。

域的名稱 位元組數 說明
Width 4 bytes 影象寬度,以畫素為單位
Height 4 bytes 影象寬度,以畫素為單位
Bit depth 1 bytes 顏色型別::
0:灰度影象, 1,2,4,8或16
2:真彩色影象,8或16
3:索引彩色影象,1,2,4或8
4:帶α通道資料的灰度影象,8或16
6:帶α通道資料的真彩色影象,8或16
ColorType 1 bytes 影象深度:
索引彩色影象:1,2,4或8
灰度影象:1,2,4,8或16
真彩色影象:8或16
Compression method 1 bytes 壓縮方法(LZ77派生演算法)
Filter method 1 bytes 濾波器方法
Interlace method 1 bytes 隔行掃描方法:
0:非隔行掃描
1:Adam7(由Adam M. Costello開發的7遍隔行掃描方法)

(2)PLTE
對於索引影象,調色盤資訊是必須的,調色盤的顏色索引從0開始編號,然後是1、2……,調色盤的顏色數不能超過色深中規定的顏色數(如影象色深為4的時候,調色盤中的顏色數不可以超過2^4=16),否則,這將導致PNG影象不合法。

真彩色影象和帶α通道資料的真彩色影象也可以有調色盤資料塊,目的是便於非真彩色顯示程式用它來量化影象資料,從而顯示該影象。

PLTE資料塊是定義影象的調色盤資訊,PLTE可以包含1~256個調色盤資訊,每一個調色盤資訊由3個位元組組成:

顏色 位元組 說明
Red 1byte 0 = 黑色, 255 = 紅
Green 1byte 0 = 黑色, 255 = 綠
Blue 1byte 0 = 黑色, 255 = 藍

(3)IDAT
影象資料塊IDAT(image data chunk):它儲存實際的資料,在資料流中可包含多個連續順序的影象資料塊。

IDAT存放著影象真正的資料資訊,因此,如果能夠了解IDAT的結構,我們就可以很方便的生成PNG影象。
(4)IEND
影象結束資料IEND(image trailer chunk):它用來標記PNG檔案或者資料流已經結束,並且必須要放在檔案的尾部。

如果我們仔細觀察PNG檔案,我們會發現,檔案的結尾12個字元看起來總應該是這樣的:
00 00 00 00 49 45 4E 44 AE 42 60 82

不難明白,由於資料塊結構的定義,IEND資料塊的長度總是0(00 00 00 00,除非人為加入資訊),資料標識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82
3.資料塊結構

PNG檔案中,每個資料塊由4個部分組成,如下:

名稱 位元組數 說明
Length (長度) 4位元組 指定資料塊中資料域的長度,其長度不超過(231-1)位元組
Chunk Type Code (資料塊型別碼) 4位元組 資料塊型別碼由ASCII字母(A-Z和a-z)組成
Chunk Data (資料塊資料) 可變長度 儲存按照Chunk Type Code指定的資料
CRC (迴圈冗餘檢測) 4位元組 儲存用來檢測是否有錯誤的迴圈冗餘碼

CRC(cyclic redundancy check)域中的值是對Chunk Type Code域和Chunk Data域中的資料進行計算得到的。CRC具體演算法定義在ISO 3309和ITU-T V.42中,其值按下面的CRC碼生成多項式進行計算:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

二.JPEG格式

其實JPEG 和JPG沒有區別,JPG的全名、正式副檔名是JPEG。但因DOS、Windows 95等早期系統採用的8.3命名規則只支援最長3字元的副檔名,為了相容採用了.jpg。也因歷史習慣和相容性考慮,.jpg目前更流行。

總的來說:JPEG是檔案格式,JPG是副檔名。

JPG即使用JPEG檔案交換格式儲存的編碼影象副檔名。 JPEG聯合圖象專家組,是一種壓縮標準。兩種檔案應該沒有區別,如果做副檔名嚴格地說應是JPG。

JPEG是一個壓縮標準,又可分為標準 JPEG、漸進式JPEG及JPEG2000三種:

①標準JPEG:以24位顏色儲存單個光柵影象,是與平臺無關的格式,支援最高級別的壓縮,不過,這種壓縮是有損耗的。此型別圖片在網頁下載時只能由上而下依序顯示圖片,直到圖片資料全部下載完畢,才能看到全貌。

②漸進式 JPEG:漸進式JPG為標準JPG的改良格式,支援交錯,可以在網頁下載時,先呈現出圖片的粗略外觀後,再慢慢地呈現出完整的內容,漸進式JPG的檔案 比標準JPG的檔案要來得小。

③JPEG2000:新一代的影像壓縮法,壓縮品質更好,其壓縮率比標準JPEG高約30%左右,同時支援有損 和無失真壓縮。一個極其重要的特徵在於它能實現漸進傳輸,即先傳輸影象的輪廓,然後逐步傳輸資料,讓影象由朦朧到清晰顯示。

JPEG(Joint Photographic Experts Group)是聯合影象專家小組的英文縮寫。它由國際電話與電報諮詢委員會CCITT(The International Telegraph and Telephone Consultative Committee)與國際標準化組織ISO於1986年聯合成立的一個小組,負責制定靜態數字影象的編碼標準。

JPEG專家組開發了兩種基本的壓縮演算法、兩種資料編碼方法、四種編碼模式。具體如下:
壓縮演算法:
(1)有損的離散餘弦變換(Discrete Cosine Transform,DCT);
(2)無損的預測技術壓縮。
資料編碼方法:
(1)哈夫曼編碼;
(2)算術編碼;
編碼模式:
(1)基於DCT順序模式:編/解碼通過一次掃描完成
(2)基於DCT遞進模式:編/解碼需要多次掃描完成,掃描效果從粗糙到精細,逐級遞進
(3)無損模式:基於DPCM,保證解碼後完全精確恢復到原影象取樣值
(4)層次模式:影象在多個空間多種解析度進行編碼,可以根據需要只對低解析度資料作解碼,放棄高解析度資訊

1.JPEG檔案結構介紹

JPEG檔案使用的資料儲存方式有多種,最常用的格式稱為JPEG檔案交換格式(JPEG File Interchange Format,JFIF)。而JPEG檔案大體上可以分成兩個部分:標記碼(Tag)和壓縮資料。

標記碼由兩個位元組構成,其前一個位元組是固定值0xFF,後一個位元組則根據不同意義有不同數值。在每個標記碼之前還可以新增數目不限的無意義的0xFF填充,也就說連續的多個0xFF可以被理解為一個0xFF,並表示一個標記碼的開始。而在一個完整的兩位元組的標記碼後,就是該標記碼對應的壓縮資料流,記錄了關於檔案的諸種資訊。

常用的標記有SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。

注意,SOI等都是標記的名稱。在檔案中,標記碼是以標記程式碼形式出現。例如SOI的標記程式碼為0xFFD8,即在JPEG檔案中的如果出現數據0xFFD8,則表示此處為一個SOI標記。

下面附錄列出完整的JPEG定義的標記碼錶:

(1)SOI,Start of Image,影象開始
標記程式碼|2位元組|固定值0xFFD8

(2)APP0,Application,應用程式保留標記0
標記程式碼|2位元組|固定值0xFFE0
包含9個具體欄位:
① 資料長度|2位元組|①~⑨9個欄位的總長度,即不包括標記程式碼,但包括本欄位
② 識別符號|5位元組|固定值0x4A46494600,即字串“JFIF0”
③ 版本號|2位元組|一般是0x0102,表示JFIF的版本號1.2,可能會有其他數值代表其他版本
④ X和Y的密度單位|1位元組|只有三個值可選
0:無單位;
1:點數/英寸;
2:點數/釐米
⑤ X方向畫素密度|2位元組|取值範圍未知
⑥ Y方向畫素密度|2位元組|取值範圍未知
⑦ 縮圖水平畫素數目|1位元組|取值範圍未知
⑧ 縮圖垂直畫素數目|1位元組|取值範圍未知
⑨ 縮圖RGB點陣圖|長度可能是3的倍數|縮圖RGB點陣圖資料

本標記段可以包含影象的一個微縮版本,存為24位的RGB畫素。如果沒有微縮影象(這種情況更常見),則欄位⑦“縮圖水平畫素數目”和欄位⑧“縮圖垂直畫素數目”的值均為0。

(3)APPn,Application,應用程式保留標記n,其中n=1~15(任選)
標記程式碼|2位元組|固定值0xFFE1~0xFFF
包含2個具體欄位:
① 資料長度|2位元組|①~②2個欄位的總長度,即不包括標記程式碼,但包括本欄位
② 詳細資訊|資料長度-2位元組|內容不定

(4)DQT,Define Quantization Table,定義量化表
標記程式碼|2位元組|固定值0xFFDB
包含9個具體欄位:
① 資料長度|2位元組|欄位①和多個欄位②的總長度,即不包括標記程式碼,但包括本欄位
② 量化表|資料長度|2位元組
a)精度及量化表ID|1位元組|
高4位:精度,只有兩個可選值
0:8位;
1:16位
低4位:
量化表ID,取值範圍為0~3
b)表項|64×(精度+1))位元組|例如8位精度的量化表,其表項長度為64×(0+1)=64位元組

本標記段中,欄位②可以重複出現,表示多個量化表,但最多隻能出現4次。

(5)SOF0,Start of Frame,幀影象開始
標記程式碼|2位元組|固定值0xFFC0
包含9個具體欄位:
① 資料長度|2位元組|①~⑥六個欄位的總長度,即不包括標記程式碼,但包括本欄位
② 精度|1位元組|每個資料樣本的位數,通常是8位,一般軟體都不支援 12位和16位
③ 影象高度|2位元組|影象高度(單位:畫素),如果不支援 DNL 就必須 >0
④ 影象寬度|2位元組|影象寬度(單位:畫素),如果不支援 DNL 就必須 >0
⑤ 顏色分量數|1位元組|只有3個數值可選
1:灰度圖;
3:YCrCb或YIQ;
4:CMYK
而JFIF中使用YCrCb,故這裡顏色分量數恆為3
⑥顏色分量資訊|顏色分量數×3位元組(通常為9位元組)
a)顏色分量ID|1位元組
b)水平/垂直取樣因子|1位元組|
高4位:水平取樣因子
低4位:垂直取樣因子
c)量化表|1位元組|當前分量使用的量化表的ID

本標記段中,欄位⑥應該重複出現,有多少個顏色分量(欄位⑤),就出現多少次(一般為3次)。

(6)DHT,Difine Huffman Table,定義哈夫曼表
標記程式碼|2位元組|固定值0xFFC4
包含2個具體欄位:
①資料長度|2位元組|欄位①和多個欄位②的總長度,即不包括標記程式碼,但包括本欄位
② 哈夫曼表|資料長度-2位元組
a)表ID和表型別|1位元組|
高4位:型別,只有兩個值可選
0:DC直流;
1:AC交流
低4位:哈夫曼表ID,注意,DC表和AC表分開編碼
b)不同位數的碼字數量|16位元組
c)編碼內容|16個不同位數的碼字數量之和(位元組)

本標記段中,欄位②可以重複出現(一般4次),也可以致出現1次。例如,Adobe Photoshop 生成的JPEG圖片檔案中只有1個DHT標記段,裡邊包含了4個哈夫曼表;而Macromedia Fireworks生成的JPEG圖片檔案則有4個DHT標記段,每個DHT標記段只有一個哈夫曼表。

(7)DRI,Define Restart Interval,定義差分編碼累計復位的間隔
標記程式碼|2位元組|固定值0xFFDD
包含2個具體欄位:
①資料長度|2位元組|固定值0x0004,①~②兩個欄位的總長度, 即不包括標記程式碼,但包括本欄位
②MCU塊的單元中的重新開始間隔|2位元組|設其值為n,則表示每n個MCU塊就有一個,RSTn標記。第一個標記是RST0,第二個是RST1等,RST7後再從RST0重複。

如果沒有本標記段,或間隔值為0時,就表示不存在重開始間隔和標記RST

(8)SOS,Start of Scan,掃描開始 12位元組
標記程式碼|2位元組|固定值0xFFDA
包含2個具體欄位:
①資料長度|2位元組|①~④兩個欄位的總長度,即不包括標記程式碼,但包括本欄位
②顏色分量數|1位元組|應該和SOF中的欄位⑤的值相同,即:
1:灰度圖是;
3: YCrCb或YIQ;
4:CMYK。
而JFIF中使用YCrCb,故這裡顏色分量數恆為3
③顏色分量資訊
a) 顏色分量ID|1位元組
b) 直流/交流係數表號|1位元組|
高4位:直流分量使用的哈夫曼樹編號
低4位:交流分量使用的哈夫曼樹編號
④ 壓縮影象資料
a)譜選擇開始|1位元組|固定值0x00
b)譜選擇結束|1位元組|固定值0x3F
c)譜選擇|1位元組|在基本JPEG中總為00

本標記段中,欄位③應該重複出現,有多少個顏色分量(欄位②),就出現多少次(一般為3次)。本段結束後,緊接著就是真正的影象資訊了。影象資訊直至遇到一個標記程式碼就自動結束,一般就是以EOI標記表示結束。

(9)EOI,End of Image,影象結束 2位元組
標記程式碼|2位元組|固定值0xFFD9

這裡補充說明一下,由於在JPEG檔案中0xFF具有標誌性的意思,所以在壓縮資料流(真正的影象資訊)中出現0xFF,就需要作特別處理。具體方法是,在資料0xFF後新增一個沒有意義的0x00。換句話說,如果在影象資料流中遇到0xFF,應該檢測其緊接著的字元,如果是
1)0x00,則表示0xFF是影象流的組成部分,需要進行譯碼;
2)0xD9,則與0xFF組成標記EOI,則影象流結束,同時影象檔案結束;
3)0xD0~0xD7,則組成RSTn標記,則要忽視整個RSTn標記,即不對當前0xFF和緊接的0xDn兩個位元組進行譯碼,並按RST標記的規則調整譯碼變數;
3)0xFF,則忽視當前0xFF,對後一個0xFF再作判斷;
4)其他數值,則忽視當前0xFF,並保留緊接的此數值用於譯碼。

2.JPEG影象編碼

在實際應用中,JPEG影象編碼演算法使用的大多是離散餘弦變換、Huffman編碼、順序編碼模式。這樣的方式,被人們稱為JPEG的基本系統。這裡介紹的JPEG編碼演算法的流程,也是針對基本系統而言。基本系統的JPEG壓縮編碼演算法一共分為11個步驟:顏色模式轉換、取樣、分塊、離散餘弦變換(DCT)、Zigzag 掃描排序、量化、DC係數的差分脈衝調製編碼、DC係數的中間格式計算、AC係數的遊程長度編碼、AC係數的中間格式計算、熵編碼。

(1)顏色模式轉換

JPEG採用的是YCrCb顏色空間,而BMP採用的是RGB顏色空間,要想對BMP圖片進行壓縮,首先需要進行顏色空間的轉換。YCrCb顏色空間中,Y代表亮度,Cr,Cb則代表色度和飽和度(也有人將Cb,Cr兩者統稱為色度),三者通常以Y,U,V來表示,即用U代表Cb,用V代表Cr。RGB和YCrCb之間的轉換關係如下所示:

Y = 0.299R+0.587G+0.114B

Cb = -0.1687R-0.3313G+0.5B+128

Cr = 0.5R=0.418G-0.0813B+128

一般來說,C 值 (包括 Cb Cr) 應該是一個有符號的數字, 但這裡通過加上128,使其變為8位的無符號整數,從而方便資料的儲存和計算。反之:

R = Y+1.402(Cr-128)

G = Y-0.34414(Cb-128)-0.71414(Cr-128)

B = Y+1.772(Cb-128)

(2)取樣

研究發現,人眼對亮度變換的敏感度要比對色彩變換的敏感度高出很多。因此,我們可以認為Y分量要比Cb,Cr分量重要的多。在BMP圖片中,RGB三個分量各採用一個位元組進行取樣,也就是我們常聽到的RGB888的模式;而JPEG圖片中,通常採用兩種取樣方式:YUV411和YUV422,它們所代表的意義是Y,Cb,Cr三個分量的資料取樣比例一般是4:1:1或者4:2:2(4:1:1含義就是:在2x2的單元中,本應分別有4個Y,4個U,4個V值,用12個位元組進行儲存。經過4:1:1取樣處理後,每個單元中的值分別有4個Y、1個U、1個V,只要用6個位元組就可以儲存了)。這樣的取樣方式,雖然損失了一定的精度但也在人眼不太察覺到的範圍內減小了資料的儲存量。當然,JPEG格式裡面也允許將每個點的U,V值都記錄下來。

(3)分塊

由於後面的DCT變換是是對8x8的子塊進行處理的,因此,在進行DCT變換之前必須把源圖象資料進行分塊。源圖象中每點的3個分量是交替出現的,先要把這3個分量分開,存放到3張表中去。然後由左及右,由上到下依次讀取8x8的子塊,存放在長度為64的表中,即可以進行DCT變換。注意,編碼時,程式從源資料中讀取一個8x8的資料塊後,進行DCT變換,量化,編碼,然後再讀取、處理下一個8*8的資料塊。

JPEG 編碼是以每8x8個點為一個單位進行處理的. 所以如果原始圖片的長寬不是 8 的倍數, 都需要先補成8的倍數, 使其可以進行一塊塊的處理。將原始影象資料分為8*8的資料單元矩陣之後,還必須將每個數值減去128,然後一一帶入DCT變換公式,即可達到DCT變換的目的。影象的資料值必須減去128,是因為DCT公式所接受的數字範圍是-128到127之間。

(4)離散餘弦變換

DCT(Discrete Cosine Transform,離散餘弦變換),是位元速率壓縮中常用的一種變換編碼方法。任何連續的實對稱函式的傅立葉變換中只含有餘弦項,因此,餘弦變換同傅立葉變換一樣具有明確的物理意義。DCT是先將整體影象分成N*N的畫素塊,然後針對N*N的畫素塊逐一進行DCT操作。需要提醒的是,JPEG的編碼過程需要進行正向離散餘弦變換,而解碼過程則需要反向離散餘弦變換。

正向離散餘弦變換計算公式:

F(u,v)=c(u)c(v)N1i=0N1j=0f(i,j)cos[(2i+1)π2Nu]cos[(2j+1)π2Nv]

c(u)=1N,u=0
c(u)=2N,u0

反向離散餘弦變換計算公式:

f(i,j)=N1u=0N1v=0c(u)c(v)F(u,v)cos[(2i+1)π2Nu]cos[(2j+1)π2Nv]

c(u)=1N,u=0
c(u)=2N,u0

這裡的N是水平、垂直方向的畫素數目,一般取值為8。8 * 8的二維畫素塊經過DCT操作之後,就得到了8 * 8的變換系數矩陣。這些係數,都有具體的物理含義,例如,U=0,V=0時的F(0,0)是原來的64個數據的均值,相當於直流分量,也有人稱之為DC係數或者直流係數。隨著U,V的增加,相另外的63個係數則代表了水平空間頻率和垂直空間頻率分量(高頻分量)的大小,多半是一些接近於0的正負浮點數,我們稱之為交流係數AC。DCT變換後的8*8的係數矩陣中,低頻分量集中在矩陣的左上角。高頻成分則集中在右下角。

由於大多數影象的高頻分量比較小,相應的影象高頻分量的DCT係數經常接近於0,再加上高頻分量中只包含了影象的細微的細節變化資訊,而人眼對這種高頻成分的失真不太敏感,所以,可以考慮將這一些高頻成分予以拋棄,從而降低需要傳輸的資料量。這樣一來,傳送DCT變換系數的所需要的編碼長度要遠遠小於傳送影象畫素的編碼長度。到達接收端之後通過反離散餘弦變換就可以得到原來的資料,雖然這麼做存在一定的失真,但人眼是可接受的,而且對這種微小的變換是不敏感的。

(5)Zigzag掃描排序

DCT 將一個 8x8 的陣列變換成另一個 8x8 的陣列. 但是記憶體裡所有資料都是線形存放的, 如果我們一行行的存放這 64 個數字, 每行的結尾的點和下行開始的點就沒有什麼關係, 所以 JPEG 規定按如下圖中的數字順序依次儲存和讀取64 個DCT的係數值。

這裡寫圖片描述

這樣數列裡的相鄰點在圖片上也是相鄰的了。不難發現,這種資料的掃描、儲存、讀取方式,是從8*8矩陣的左上角開始,按照英文字母Z的形狀進行掃描的,一般將其稱之為Zigzag掃描排序。如下圖所示:

這裡寫圖片描述

(6)量化

影象資料轉換為DCT頻率係數之後,還要進行量化階段,才能進入編碼過程。量化階段需要兩個8*8量化矩陣資料,一個是專門處理亮度的頻率係數,另一個則是針對色度的頻率係數,將頻率係數除以量化矩陣的值之後取整,即完成了量化過程。當頻率係數經過量化之後,將頻率係數由浮點數轉變為整數,這才便於執行最後的編碼。不難發現,經過量化階段之後,所有的資料只保留了整數近似值,也就再度損失了一些資料內容。在JPEG演算法中,由於對亮度和色度的精度要求不同,分別對亮度和色度採用不同的量化表。前者細量化,後者粗量化。

下圖給出JPEG的亮度量化表和色度量化表,該量化表是從廣泛的實驗中得出的。當然,你也可以自定義量化表。

JPEG亮度量化表
JPEG亮度量化表

JPEG色度量化表
JPEG色度量化表

這兩張表依據心理視覺閥製作, 對 8bit 的亮度和色度的圖象的處理效果不錯。量化表是控制 JPEG 壓縮比的關鍵,這個步驟除掉了一些高頻量, 損失了很多細節資訊。但事實上人眼對高頻訊號的敏感度遠沒有低頻訊號那麼敏感。所以處理後的視覺損失很小,從上面的量化表也可以看出,低頻部分採用了相對較短的量化步長,而高頻部分則採用了相對較長的量化步長,這樣做,也是為了在一定程度上得到相對清晰的影象和更高的壓縮率。另一個重要原因是所有的圖片的點與點之間會有一個色彩過渡的過程,而大量的圖象資訊被包含在低頻率空間中,經過DCT處理後, 在高頻率部分, 將出現大量連續的零。

(7)DC係數的差分脈衝調製編碼

8*8的影象塊經過DCT變換之後得到的DC係數有兩個特點:

(1)係數的數值比較大;

(2)相鄰的8*8影象塊的DC係數值變化不大;

根據這兩個特點,DC係數一般採用差分脈衝調製編碼DPCM(Difference Pulse Code Modulation),即:取同一個影象分量中每個DC值與前一個DC值的差值來進行編碼。對差值進行編碼所需要的位數會比對原值進行編碼所需要的位數少了很多。假設某一個8*8影象塊的DC係數值為15,而上一個8*8影象塊的DC係數為12,則兩者之間的差值為3。

(8)DC係數的中間格式計算

JPEG中為了更進一步節約空間,並不直接儲存資料的具體數值,而是將資料按照位數分為16組,儲存在表裡面。這也就是所謂的變長整數編碼VLI。即,第0組中儲存的編碼位數為0,其編碼所代表的數字為0;第1組中儲存的編碼位數為1,編碼所代表的數字為-1或者1……,如下面的表格所示,這裡,暫且稱其為VLI編碼表:

這裡寫圖片描述

前面提到的那個DC差值為3的資料,通過查詢VLI可以發現,整數3位於VLI表格的第2組,因此,可以寫成(2)(3)的形式,該形式,稱之