1992 年的那個夏天,一位跟您一樣的紳士在黑暗的房間裏死死盯着電腦。一旁的調制解調器瘋狂閃爍,竭盡全力讓這張 720 × 575 像素的圖片,一行一行慢加載。而這在近乎無盡的等待中,紳士幾乎要瘋狂了。
直到 JPEG 的出現解了燃眉之急!
1992 年,"聯合圖像專家組" 創建了第一個國際圖像壓縮标準,它能在不明顯降低圖像質量的基礎上,把圖像壓縮至原始大小的 10%。
随着數碼相機、掃描儀、互聯網的發展,JPEG 迅速成爲應用最廣泛的圖像格式。直到 32 年後的今天,你大爺還是你大爺,沒有任何其他圖像格式能跟 JPEG 抗衡。
JPEG 憑什麽稱霸圖像界 30 多年?它究竟有多巧妙?
視頻版
↓↓ 看完這個視頻就知道了 ↓↓
↑↑ 信我,真的超級好看 ↑↑
圖文版
在互聯網的古早時代,JPEG 是憑借強勁的壓縮實力展露頭角的。所以故事的開始,我們要從 JPEG 的壓縮原理談起。
而它的原理,可以說是妙蛙種子吃着妙脆角進了米奇妙妙屋,那叫一個妙。
在 1992 年以前,主要的圖像格式都是無損格式。要把它們壓小,首先要知道圖像中的哪些信息可以偷偷舍棄掉。這就涉及到了兩個心理視覺原理。
先講第一個:你可以看看這三張圖片,哪兩張看起來區别更大?顯然是這兩張。這是因爲人眼對亮度的變化,要比對色彩的變化敏感得多。
原因也很簡單:人眼中有視錐、視杆細胞兩種細胞,分别負責感受顔色和亮度。
負責感受顔色的視錐細胞大概有600~700 萬個,而負責感受亮度的視杆細胞則有1 億 2500 萬個,所以人眼對亮度的變化非常敏感,但對色彩的變化就遲鈍一些。
既然這樣,那就壓縮一些顔色信息呗 ~ 這就是 JPEG 壓縮的第一步。
怎麽壓縮顔色呢?很簡單,圖片由一個個像素組成,每個像素包含紅綠藍三種元素,利用這個公式,我們可以把 RGB 模型轉換成YCbCr 模型,其中 Y 表示亮度,Cb 和 Cr 分别表示藍色和紅色的色度。
轉換完後,就可以把藍色、紅色色度這兩張圖,每四小塊合并成一大塊,這樣就把顔色信息壓成了原來的1/4——反正人眼對顔色不敏感,所以也不會有太大影響。這就是 JPEG 對第一個視覺原理的應用。
而第二個視覺原理是:人眼擅長感受低頻信号,卻不擅長感受高頻信号。
這是什麽意思呢?低頻信号,是這種指像素之間變化比較平緩的線條。比如整片的天空和岩石表面。而高頻信号,是指這種像素之間變化比較劇烈的線條,比如複雜紋理。
比如你可能根本沒發現,這張圖片的左下角還藏着一隻花豹。這就是因爲你的眼睛對高頻信号不敏感。
所以隻要把圖片中的高頻信号删掉一些,就可以把圖片再壓小一點。
但問題是,怎麽區分高頻和低頻信号呢?這裏,就涉及到 JPEG 算法的精髓了。
讓我們請出小李子當一下模特:如果我們隻看其中一行像素的亮度值,那它的頻率變化曲線是這樣的,非常複雜。
但所有複雜的事物,都可以還原爲簡單事物的集合。比如不管多複雜的圖案,都可以用最基礎的積木搭建出來。任何一條曲線,都可以還原爲若幹餘弦波的疊加。這行像素的頻率變化曲線也一樣。利用這 8 條基礎頻率曲線,就可以把它給拼湊出來。
一行像素是一維的,但圖片是二維的。那再把 8 條頻率曲線豎着排一列,重疊的位置兩兩疊加,我們就得到了一張由64 個基函數構成的 " 基圖 "。
關鍵就在這裏,這 " 基圖 " 中的這 64 個基函數,每個都相當于一塊積木。任何一張圖片的顔色和亮度圖層,都可以用這些積木搭建出來。
比如我們可以把亮度圖層中每8*8 個像素劃分成一個區塊,然後用基函數去 " 量 " 這個區塊,得到一個矩陣。矩陣中的每一個數字,就代表這張圖需要用到多少塊不同的積木。
這裏的 275.5,就代表它需要用 275.5 個第一種積木,59.5 個第二種積木 ......
更妙的是,觀察整個矩陣,你會發現左上角的數字遠大于右下角,因爲左上角的 " 積木 " 代表的是低頻信号。而絕大多數圖片中的主要信息,都是低頻信号。而高頻信号,比如你臉上的鼻孔、痘痘、皺紋,跟那張大臉比起來,隻是一小部分而已。
爲了進一步區分低頻和高頻信号,專家組還提供了一組量化矩陣。隻要用處理好的亮度和色度圖層分别除以量化矩陣,就能得到一大堆 0,隻剩下9 個非 0 的數字。
這意味着,其實隻要用 9 種基礎 " 積木 ",就能把小李子搭的人模人樣了。這能讓我們大大減少圖片的信息量。
而且量化矩陣裏面的數字還可以根據需求變化。如果你想把圖片壓小,那最終得到的 0 越多,要用到的積木越少,但出現這種鋸齒狀的 "僞影" 的概率也就越大。
至于這些 0,就是人眼比較麻木的高頻信息,把它們編碼打包,減少冗餘,JPEG 的壓縮就大功告成了。
可以看出,JPEG 的巧妙,在于它充分利用了人類視覺的特點,巧妙地用算法舍棄了你注意不到的信息,實現了出色的壓縮效果。
但 JPEG 之所以始終是圖像界的大爺,靠的不光是技術,還有當時拉胯的算力。比如在 JPEG 誕生的時候,就有比它更會壓縮的算法,叫 "卡洛南 - 洛伊變換"。但它所需要的計算量太大,遠超出那個年代的計算機可實現的水平。所以排名第二的 DCT 算法才成爲了最終的赢家。
而且畢竟是最早一代的圖像壓縮标準, 随着後續的改進,JPEG 的孫子輩們在實力上也已經超越了它。比如在 2000 年,聯合圖像專家組又發布了另一種新的壓縮圖像标準:JPEG2000。它能在保持相同圖像質量的情況下,把壓縮率提高 200%,甚至還支持無損壓縮。
但那又怎麽樣呢?JPEG 的人脈太廣,牢牢把持住了互聯網。直到目前,與 JPEG2000 兼容的軟件、浏覽器還是比較少,跟我一樣老,誕生于 1992 年的 JPEG 仍然是目前最普遍認可的圖像文件格式,你大爺還是你大爺。
所以,JPEG 之所以始終是你大爺,固然有自身技術出色的原因,但也是因爲它把握住了曆史的進程。
最後,除了 JPEG 以外,還有另一種格式也很常見:JPG。那 JPEG 和 JPG 有什麽區别?
它們最大的區别,就是 JPEG 有四個字母,而 JPG 有三個字母,别的就沒有了。
沒開玩笑。
在 Windows 95 之前,Windows 操作系統最多隻支持三個字符的文件擴展名,所以 JPEG 被縮寫成了 JPG,中間的 E 被省略了。而這種限制在 MAC 等類 UNIX 系統中并不存在,在 Windows 95 之後的操作系統在也不存在,所以 JPG 又可以用回大名 JPEG 了。
就是這樣 ~