圖片壓縮原理與優(yōu)化

2013-7-12    藍(lán)藍(lán)設(shè)計(jì)的小編

轉(zhuǎn)載藍(lán)藍(lán)設(shè)計(jì)(   yvirxh.cn  )是一家專注而深入的設(shè)計(jì)機(jī)構(gòu) ,為期望卓越的國(guó)內(nèi)外企業(yè)提供有效的   BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、  ipad界面設(shè)計(jì)   、  包裝設(shè)計(jì) 、  圖標(biāo)定制 、  用戶體驗(yàn) 、交互設(shè)計(jì)、   網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)

來(lái)源:http://tid.tenpay.com/?p=4711

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中,   請(qǐng)點(diǎn)這里未標(biāo)題-333

前言:該文收集了前輩們的一些關(guān)于圖片優(yōu)化的技巧,在此收攏到一起,對(duì)于各個(gè)方法的優(yōu)化原理做了一些研究,希望能給大家對(duì)于圖片優(yōu)化這一塊起到拋磚引玉的作用。

提到圖片,我們不得不從位圖開(kāi)始說(shuō)起,位圖圖像(bitmap),也稱為點(diǎn)陣圖像或繪制圖像,是由稱作像素(圖片元素)的單個(gè)點(diǎn)組成的。這些點(diǎn)可以進(jìn)行不同的排列和染色以構(gòu)成一副圖片。當(dāng)放大位圖時(shí),可以看見(jiàn)賴以構(gòu)成整個(gè)圖像的無(wú)數(shù)單個(gè)方塊。

常見(jiàn)的格式中JPG、PNG、GIF亦屬于位圖,所以它們的數(shù)據(jù)結(jié)構(gòu)大致相同,只是每一種圖片格式都有不同的壓縮算法,不同的掃描方式,但是優(yōu)化的方法都有一個(gè)共同點(diǎn),都是圍繞著每個(gè)像素顏色值來(lái)下手,具體如何進(jìn)行優(yōu)化呢?
下面來(lái)給大家介紹一下圖片的一些基本原理和優(yōu)化的方法:

1.JPG原理與優(yōu)化
JPG是一種對(duì)彩色或灰階之類(lèi)連續(xù)色調(diào)圖形作壓縮和解壓縮的標(biāo)準(zhǔn).這個(gè)標(biāo)準(zhǔn)是由ISO/IEC JTC1/SC29 WG10所訂定。
壓縮算法為正、反離散余弦轉(zhuǎn)換,如下圖:

正離散余弦轉(zhuǎn)換
反離散余弦轉(zhuǎn)換即把整個(gè)流程反轉(zhuǎn)。
這里的8X8像素區(qū)塊是我們JPG優(yōu)化方法的重點(diǎn),在之后會(huì)涉及到取樣、區(qū)塊量化、掃描的步驟,然而取樣、區(qū)塊量化這兩個(gè)步驟將是導(dǎo)致圖像失真的過(guò)程,也是我們優(yōu)化工作所涉及到核心部分。

取樣:
這里所提到的可以很好的解釋到下面JPG優(yōu)化方法中的色彩優(yōu)化;
JPG將不同的色彩當(dāng)作獨(dú)立的成份,因此各個(gè)成份可以被視為一個(gè)灰階影像來(lái)處理,如果各個(gè)顏色成份間沒(méi)有關(guān)聯(lián)性時(shí).便可以將壓縮的效果處理得最好,因此把紅(R)、綠(G)、藍(lán)(B)的成份轉(zhuǎn)換成:亮度 (Luminance)(Y)、色度 (Chrominance)(Cb和 Cr),使得各項(xiàng)沒(méi)有關(guān)聯(lián)的成份:
Y = 0.299R+0.587G+0.144B
Cb = -0.169R-0.331G+0.500B
Cr = 0.500R- 0.419G –0.081B
由于人的視力系統(tǒng)對(duì)色度的敏銳度不高 ,因此以YCbCr色度的方式來(lái)表示可以再做一次作取樣(Subsampling)來(lái)減低信息量:

jpg取樣

4:4:4格式代表YCbCr原來(lái)完整的信息,可以再次取樣以4:2:2或4:2:0格式來(lái)表達(dá);4:2:2格式將原本的信息量減少為三分之二,而4:2:0格式則可以將信息三減少為一半。雖然色度的信息量減少了.但對(duì)人的視覺(jué)神經(jīng)而言卻僅僅感受到微小的差別而已。

區(qū)塊量化:
為了說(shuō)明執(zhí)行離散余弦轉(zhuǎn)換(DCT)的影響,我們將以自一張圖去下的8×8區(qū)塊的亮度資料轉(zhuǎn)換成符合DCT運(yùn)算范圍內(nèi)的系數(shù)表:
QQ圖片20130531152153

低頻部分包含了區(qū)塊的大部分能量,而對(duì)視覺(jué)較不敏感的高頻部分,則通常只含有較低的能量。

接下來(lái)對(duì)亮度系數(shù)做量化處理的矩陣系數(shù)表:
QQ圖片20130531153108

在亮度系數(shù)的量化方面每個(gè)DCT系數(shù)除以相對(duì)的量化矩陣的值,在四舍五入后得到如下的量化后 DCT 系數(shù)(例如-80/16=-5):
QQ圖片20130531153425

注意量化后區(qū)塊高頻部份出現(xiàn)許多零值,代表人類(lèi)視覺(jué)系統(tǒng)對(duì)高頻部份并不敏感。由于四舍五入的部份并不能在解碼時(shí)重現(xiàn),因此這個(gè)步驟將是個(gè)失真的過(guò)程。

掃描:
區(qū)塊在量化之后,只有低頻的部分有非零值,為了進(jìn)一步地減少儲(chǔ)存空間的大小,盡可能地將零值放在一起,使得處理時(shí)能以幾個(gè)零來(lái)表示而非個(gè)別的處理每個(gè)零,因此運(yùn)用了如下圖的方式做斜向掃描:

圖片1
這種斜向掃描的掃描線乃是沿著空間頻率大小增加的方向作掃描的,使得許多的零可以被串接在一起,以達(dá)到更好的效果。
了解上述3個(gè)流程后,后續(xù)我們做JPG優(yōu)化的時(shí)候會(huì)更得心應(yīng)手了,如何處理顏色,如何減少顏色數(shù)值而卻又最少的減少圖片失真的比率。
接下來(lái)為大家介紹下JPG常用的幾種優(yōu)化方法:

8像素柵格
如下2副圖片所示,圖片為32X32,白色方塊寬高為8X8:
8x8輔助線 8x8輸出
正如大家看到的,左上角的小方塊正好對(duì)齊在“8像素柵格”,這樣就確保小方塊保持是銳利。當(dāng)保存的時(shí)候,圖片會(huì)被分成許多的8×8 px的區(qū)塊,而軟件是對(duì)每一個(gè)區(qū)塊進(jìn)行獨(dú)立優(yōu)化的。由于右下方的方塊并不匹配這些區(qū)塊(也就是這個(gè)方塊跨越了幾個(gè)區(qū)塊,正好落于區(qū)塊的交接線上),優(yōu)化器在尋找索引的時(shí)候就會(huì)在黑色和白色之間尋找平衡,即添加了雜色。

示例:
示例

不仔細(xì)看可能發(fā)現(xiàn)不了,第二幅圖片中盒子的黑子蓋子左邊超出的區(qū)域、99數(shù)字超出的多余像素均已刪除,198.00元下移了一個(gè)像素,3個(gè)很簡(jiǎn)單的操作便可減少約1K,做到這一步,大家肯定會(huì)考慮一個(gè)問(wèn)題,難道每次做圖的時(shí)候都要拉著么輔助線不麻煩么?
其實(shí),這里只是為了做一個(gè)的示范,如果應(yīng)用到工作中,我們大可將8X8的輔助方格改為16X16或者32X32。

圖片質(zhì)量
不要保存質(zhì)量為100的圖片。這個(gè)并不是最高質(zhì)量的圖片,只是一個(gè)數(shù)值上的優(yōu)化底線,最終你會(huì)得到一個(gè)不合理的大文件。事實(shí)上把質(zhì)量設(shè)置在95以上就已經(jīng)足以防止丟失信息了。
在質(zhì)量上有個(gè)分水嶺,這就是我們通常建議JPG質(zhì)量最好是在60左右的原因。當(dāng)在Photoshop中把質(zhì)量設(shè)置低于51的時(shí)候,它就會(huì)執(zhí)行另一個(gè)叫做“降色采樣(原文:color down-sampling)”的優(yōu)化算法,它會(huì)在8個(gè)像素周?chē)骄蓸樱@樣會(huì)在邊緣產(chǎn)生雜色。
因此,如果圖片很小而且對(duì)比很大,建議在Photoshop中不要設(shè)置質(zhì)量低于51。

圖例(左為質(zhì)量51右為質(zhì)量50):
質(zhì)量51 質(zhì)量50

色彩優(yōu)化
這里優(yōu)化的原理在于解壓縮過(guò)程,反量化與斜向掃描中著手。這里涉及到兩個(gè)量化矩陣(亮度與色度)的處理。
但是此方法用到的情況相對(duì)比較少,所以這里只做簡(jiǎn)短的介紹。
Photoshop有一個(gè)Lab的顏色模式,L表示亮度(Luminosity),a表示從洋紅色至綠色的范圍,b表示從黃色至藍(lán)色的范圍。
通道示意
其中在這里最重要的就是明度(也稱為亮度),優(yōu)化圖像的時(shí)候通常是壓縮顏色通道,但盡可能保持高亮的亮度通道,因?yàn)槿藗儗?duì)它最為敏感。
這里最關(guān)鍵的是濾鏡>>雜色>>中間值針對(duì)A,B兩個(gè)通道的顏色做處理

2.PNG原理與優(yōu)化
PNG,圖像文件儲(chǔ)存格式,其目的是試圖替代GIF和TIFF的文件格式,同時(shí)增加一些GIF所不具備的特性。PNG提供5種圖片類(lèi)型:灰度,真彩色,索引色,帶alpha通道的灰度,帶alpha通道的真彩色,遺憾的是Photoshop只能導(dǎo)出3種圖像類(lèi)型:帶透明的索引顏色,真彩色,帶透明度的真彩色。
對(duì)于PNG圖像,可以分為索引(Index)圖和RGB圖兩種,索引圖只包含固定數(shù)量的顏色,而RGB圖的顏色數(shù)量是不受限制的。
索引圖:為節(jié)約存儲(chǔ),把圖像中使用的顏色與一個(gè)顏色表對(duì)應(yīng)起來(lái),索引色常使用16色、32色、64色、128色或256色等,但最多不得超過(guò)256色;
RGB圖:的每一個(gè)象素都保存一個(gè)RGB值,代表這個(gè)象素的顏色,因此,一張RGB圖有多少個(gè)象素,文件中就保存多少個(gè)RGB值;

壓縮:
PNG采取的是LZ77無(wú)損數(shù)據(jù)壓縮算法:LZ77算法簡(jiǎn)單來(lái)說(shuō)就是通過(guò)使用編碼器或者解碼器中已經(jīng)出現(xiàn)過(guò)的相應(yīng)匹配數(shù)據(jù)信息替換當(dāng)前數(shù)據(jù)從而實(shí)現(xiàn)壓縮功能。
最重要的還是線性過(guò)濾(也稱為“三角過(guò)濾”),PNG有5種過(guò)濾器,None(無(wú)過(guò)濾),Sub(當(dāng)前值減去左側(cè)像素的值),Up(減去上方像素的值),Average(減去左側(cè)和上方像素的平均值)和Paeth(替換上方,左邊或者上方的左邊像素值,并重新以Alan Paeth命名)。下面只舉例其中之一的Up過(guò)濾:

png過(guò)濾2

以數(shù)字2為標(biāo)識(shí)的每一行都經(jīng)過(guò)了“Up過(guò)濾”,“Up過(guò)濾”向 png 解碼器發(fā)送信息:“對(duì)于當(dāng)前的像素,提取上方像素的值,并將其添加到當(dāng)前值”。圖中第2-5行垂直方向都擁有相同的值。所以它們的值都是0,如果這樣的圖片越大那么壓縮比率也越大。

掃描:
PNG的掃描方式很簡(jiǎn)單,只存在兩種:非隔行掃描、Adam7(7遍隔行掃描方法)
Adam7(由Adam M. Costello開(kāi)發(fā)的7遍隔行掃描方法),原理如下圖:

Adam7_passes

QQ圖片20130604153902

圖片示例:
Adam7_make_awesome_face

常用的兩種PNG優(yōu)化方法:
色調(diào)分離
優(yōu)化原理:有效的減少色彩數(shù),合并相似的顏色,創(chuàng)建出色調(diào)區(qū)域,更好的執(zhí)行“線性過(guò)濾”,得到高壓縮率。
缺點(diǎn):這種方法有一定的局限性,尤其是優(yōu)化的圖片與 html 背景融合的情況下須慎用。
這里的色階值可根據(jù)實(shí)際情況設(shè)置:

QQ圖片20130528173159

優(yōu)化圖片對(duì)比:
原圖    原圖:212KB

色調(diào)分離    優(yōu)化后:146KB

圖層分離
有時(shí)候因?yàn)閳D片中存在一些半透明像素,不得不保存一個(gè)“重量級(jí)”的PNG-24文件。如果將此類(lèi)圖像一分為二,一部分是不透明像素,另一部分則為半透明,然后各以適當(dāng)格式保存。
比如你可以用 PNG-24 格式保存半透明像素,而不透明像素則用 PNG-8 甚至 JPEG 格式保存。
例如:

ceshi3ceshi31

操作步驟:
1.在圖層面板中Ctrl+左鍵單擊圖層建立選區(qū);
2.切換至通道面板,將選區(qū)儲(chǔ)存為通道;
3.選擇該通道,取消選區(qū),將閾值(圖像 -> 調(diào)整 -> 閾值)調(diào)至255;
4.再次Ctrl+左鍵單擊該通道建立選區(qū)并隱藏該通道,然后選擇原始圖層,打開(kāi)圖層 -> 新建 -> 通過(guò)剪切的圖層,即能得到上面兩幅分離后的圖片。
5.可再次對(duì)兩幅圖片進(jìn)行色調(diào)分離等方法進(jìn)行優(yōu)化。
此方法類(lèi)似活動(dòng)中背景圖過(guò)大時(shí)進(jìn)行分割是為同一個(gè)道理,多增加一個(gè)請(qǐng)求而把圖片拆分,進(jìn)行疊加。

3.GIF原理與優(yōu)化
由于GIF現(xiàn)在使用率偏低,除非需要用到GIF動(dòng)畫(huà),由于PNG本身是開(kāi)發(fā)者為了代替GIF而衍生出的圖片格式,所以透明圖片建議采用PNG8。下面只簡(jiǎn)單的介紹下GIF的原理:
GIF(Graphics Interchange Format)的原義是“圖像互換格式”,是CompuServe公司在 1987年開(kāi)發(fā)的圖像文件格式。GIF文件的數(shù)據(jù),是一種基于LZW算法的連續(xù)色調(diào)的無(wú)損壓縮格式。其壓縮率一般在50%左右,它不屬于任何應(yīng)用程序。GIF格式的另一個(gè)特點(diǎn)是其在一個(gè)GIF文件中可以存多幅彩色圖像,如果把存于一個(gè)文件中的多幅圖像數(shù)據(jù)逐幅讀出并顯示到屏幕上,就可構(gòu)成一種最簡(jiǎn)單的動(dòng)畫(huà)。

LZW壓縮算法
LZW就是通過(guò)建立一個(gè)字符串表,用較短的代碼來(lái)表示較長(zhǎng)的字符串來(lái)實(shí)現(xiàn)壓縮,字符串和編碼的對(duì)應(yīng)關(guān)系是在壓縮過(guò)程中動(dòng)態(tài)生成的,并且隱含在壓縮數(shù)據(jù)中,解壓的時(shí)候根據(jù)表來(lái)進(jìn)行恢復(fù),算是一種無(wú)損壓縮。例如:
正常文本:好人經(jīng)常說(shuō)自己是好人,但是我確實(shí)是個(gè)好人。
壓縮文本:$1經(jīng)常說(shuō)自己是$1,但是我確實(shí)是個(gè)$1. $1=[好人]

文章已經(jīng)接近尾聲了,相信經(jīng)過(guò)這啰啰嗦嗦一大堆文字,大家對(duì)圖片優(yōu)化也會(huì)有一個(gè)相對(duì)清晰的思路了,期待能一起尋找探討更多的優(yōu)化方法。

參考資料:
書(shū)籍:JPG原理與數(shù)據(jù)檔案
PNG文件格式白皮書(shū):http://www.w3.org/TR/REC-png.html
GIF文件數(shù)據(jù)結(jié)構(gòu):http://wenku.baidu.com/view/06eaedcdda38376baf1fae8e.html

日歷

鏈接

個(gè)人資料

存檔