但請記住,我們在使用有損壓縮,并沒有免費(fèi)午餐。午餐很便宜,但我們必須付錢。當(dāng)我們將壓縮過的文件之一解壓到原圖大小時,看看發(fā)生了什么。因?yàn)槠渲幸恍┫袼匦泻土斜粍h除,計(jì)算機(jī)必須推測這些消失像素的顏色是什么。最簡單的可能推測是給任一消失像素以其相鄰像素之一的顏色。選擇任一相鄰像素都可以,但在這個例子里,計(jì)算機(jī)選擇了消失像素正上方和左邊的像素。
這一解壓機(jī)制的結(jié)果顯示在圖右側(cè)。能看到大部分視覺特征得到了保留,但在畫質(zhì)和細(xì)節(jié)上有一些明顯損失,特別是在樹、角樓房頂以及房屋山形墻的格子通氣孔等復(fù)雜區(qū)域。另外,特別是在解壓自80×60圖片的版本中,你能在房屋屋頂?shù)男本€等區(qū)域看到一些相當(dāng)令人不悅的鋸齒。這些現(xiàn)象被我們稱為“壓縮缺陷”(compression artifact):不僅僅是細(xì)節(jié)的損失,而且有損壓縮的某種方法會在接下來的解壓中引入明顯的新特征。
盡管拋棄把戲在理解有損壓縮的基本思想上很有用,但在這里描述的簡單拋棄把戲卻極少用到。計(jì)算機(jī)的確會“拋棄”信息以實(shí)現(xiàn)有損壓縮,但它們對拋棄哪些信息卻要小心得多。這方面的常見例子之一,就是JPEG圖像壓縮格式。JPEG是一種精心設(shè)計(jì)的圖像壓縮技術(shù),它在效果上要比每兩行(列)拋棄一行(列)的拋棄把戲好很多。仔細(xì)看看下面的圖,將圖片的質(zhì)量和大小與上圖相比。最上方的JPEG圖片大小為35 KB,但幾乎和原始圖片相同。通過拋棄更多信息并繼續(xù)使用JPEG格式,我們得到了中間大小為19 KB的圖。盡管房屋的格子通氣孔有些模糊和細(xì)節(jié)上的損失,但中間圖片的質(zhì)量依然很棒。但如果壓縮得太厲害,JPEG格式也會有壓縮缺陷:最底部的JPEG圖被壓縮到只有12 KB,你能看到天空中出現(xiàn)了一些塊狀效果,在房頂斜線右邊的天空也出現(xiàn)了一些令人不快的斑點(diǎn)。
盡管JPEG拋棄戰(zhàn)略的細(xì)節(jié)太過技術(shù)化,在這里不能完整描述,但這項(xiàng)技術(shù)的基本原理還算好說。JPEG首先將整張圖片劃分為8×8像素的小方塊,每個方塊都會被單獨(dú)壓縮。注意,在沒有壓縮的情況下,每個方塊代表8×8=64個數(shù)字。(我們假設(shè)這是張黑白照片——如果它是彩色圖片,那么就會有三種不同的顏色,數(shù)字會是原來的三倍,但在這里我們不要擔(dān)心這一細(xì)節(jié)。)如果方塊恰好只有一種顏色,整個方塊就能由一個數(shù)字代表,而計(jì)算機(jī)就能“拋棄”63個數(shù)字。如果方塊大部分由一種顏色組成,只有少數(shù)像素的顏色略有不同(也許一片天空的灰度都相同),計(jì)算機(jī)也可以用單個數(shù)字代表方塊,讓方塊得到好的壓縮結(jié)果,并在稍后解壓時只出現(xiàn)少量錯誤。在上圖中的最后一張圖中,天空中一些8×8的塊,就是采用這種方法壓縮,導(dǎo)致出現(xiàn)了一些單色方塊。
如果8×8方塊從一種顏色漸變?yōu)榱硪环N顏色(比如左邊是深灰色,右邊是淺灰色),那么64個數(shù)字也許能被壓縮到只有2個:一個深灰的值和一個淺灰的值。JPEG算法并不一定這么運(yùn)作,但它使用了相同的思想:如果一個8×8方塊符合一些已知模式如時時色(constant color)或漸變色(smoothly varying color)的組合,那么其大部分信息就可以被拋棄,只需存儲每個模式的級別或量即可。