圖片格式:WebP

Google 最初開發的 WebP 為有損圖片格式,用於取代 JPEG,這種格式能夠產生的檔案小於以 JPEG 編碼的相同品質圖片檔。之後的這個格式更新引進了無損壓縮、類似 PNG 的 Alpha 通道透明度和類似 GIF 的動畫選項,而且都可以與 JPEG 樣式的失真壓縮搭配使用。WebP 是不可思議的多功能格式。

WebP 的有損壓縮演算法是以 VP8 影片轉碼器壓縮影片中主要畫面格的方法,整體而言,這與 JPEG 編碼相似:WebP 是以「模塊」(而非個別像素) 的方式運作,且亮度與色度的劃分方式也類似。WebP 的亮度區塊是 16x16,色塊區塊是 8x8,而這些「巨集區塊」再進一步細分為 4x4 子區塊。

如果 WebP 與 JPEG 有極大差異,則同時提供「區塊預測」和「自動調整區塊量化」這兩項功能。

區塊預測

「區塊預測」是指根據各區塊周圍區塊的值 (尤其是目前區塊上方與左側的區塊),預測每個色度與亮度區塊的內容。如您所想,這進行這項工作的演算法相當複雜,但以淺顯易懂的語言說明:「如果目前區塊上方有藍色,而目前區塊左側的藍色,假設這個區塊是藍色,則假設這個區塊為藍色」。

事實上,PNG 和 JPEG 也會根據「某種」度的預測進行這類預測。然而,WebP 的獨特之處在於,它會對周遭區塊的資料取樣,然後嘗試透過幾種不同的「預測模式」填入目前的區塊,有效嘗試「繪製」圖片中遺漏的部分。接著,系統會將每個預測模式提供的結果與實際圖片資料進行比較,然後選取最接近的預測相符項目。

WebP 的各種區塊預測方法圖表。

當然,最近的預測比對不會完全正確,因此,該區塊的預測值和實際值之間的差異都會編碼在檔案中。在解碼圖片時,轉譯引擎會使用相同的資料套用相同的預測邏輯,為每個區塊產生相同的預測值。預測與檔案中編碼的預期圖片之間的差異便會套用至預測。這類似於 Git 修訂版本代表套用至本機檔案 (而不是建立新的檔案副本) 的不同分支修補程式。

說明:我們不會深入研究真正預測演算法中涉及的複雜數學,我們以單一預測模式來發明類似 WebP 的編碼,並透過傳統格式有效轉發一連串數字。我們的演算法只有單一預測模式,我們稱之為「預測模式一」:每個區塊的值都是上方區塊與左邊區塊之間的值總和 (從 1 開始)。

現在,假設我們從下列實際圖片資料開始:

111151111
122456389

我們會使用預測模型判斷 2x9 方格的內容,得到的結果如下:

111111111
123456789

我們的資料非常適合我們所發明的預測演算法,因此預測資料會與實際資料相近。當然不是最理想的結果,因為實際資料有幾個區塊,與預測資料不同。因此,我們傳送的編碼不只包含要使用的預測方法,還包含任何應與預測值不同的區塊差異:

_ _ _ _ +4 _ _ _ _
_ _ -1 _ _ _ -4 _ _

輸入與先前討論過的某些舊版格式編碼相同的淺顯語言:

2x9 方格的網格。以及從 4 到 1x5、-1 到 2x3、-4 到 2x7。

最終結果產生了效率不彰的編碼檔案。

自動調整區塊量化

JPEG 壓縮是一種大量作業,會將相同等級的量化套用至圖片中的每個區塊。在一張統一構圖的圖片中,完全合理,但真實世界的相片並未比周遭世界更加統一。從實務上來說,這表示 JPEG 壓縮設定不會取決於高頻率細節 (JPEG 壓縮效能優等),但是由壓縮成果最可能出現的部分圖片部分決定。

壓縮為帝王蝶的 JPEG 圖片

從這個誇張的範例來看,前景中帝王的翅膀看起來相對銳利,比高解析度原版還有些微粒子,但少了原圖,因此前景會顯得與原圖不同。同樣地,細菌和前景的葉子逐漸增加,我和我都可能會使用受過專業訓練的視力,看到壓縮成果的追蹤記錄,但即使壓縮後遠遠超出前景的合理範圍,仍看得更清楚。相片左上方的低頻率資訊 (綠色背景模糊的綠色背景) 看起來「很糟糕」。即便是未經訓練的檢視器,也會立即發現品質問題,因為背景中的細微漸層會無條件捨去為鋸齒狀的單色區塊。

為避免這種情況,WebP 會採用「自動調整」方法量化:將圖片分成最多四個看起來像是相似的片段,而這些片段的壓縮參數會分別調整。搭配 WebP 使用相同大小的壓縮:

經過壓縮的帝王蝴蝶 WebP 圖片

這兩種圖片檔的大小大致相同。檢視帝王翅膀時的品質大不相同,只要仔細查看,在最終結果中有一些微小的差異,但整體品質沒有任何差異。在 WebP 中,牛奶的花朵只是「微不足道」,但還是不容易察覺,除非您要並排比較兩者並確實找出品質差異,我們的方式就是如此。背景則是截然不同的故事,幾乎沒有 JPEG 明顯可見成果的痕跡。WebP 提供相同的檔案大小,但圖片品質也更高,比如說,心理視覺系統無法偵測出兩者是否並未精準比較,只能提供少數細小的細節。

使用 WebP

WebP 的內部可能比 JPEG 編碼更為複雜,但就像我們日常工作一樣簡單:WebP 的所有複雜性都會標準化為一個「quality」值,就像 JPEG 一樣。這不代表我們限制使用單一廣泛的「品質」設定。如果只需深入瞭解這些通常隱藏的設定如何影響檔案大小與品質,建議您 (也應該) 針對 WebP 編碼的所有細節進行微調。

Google 提供 cwebp 指令列編碼器,可用來轉換或壓縮個別檔案或整個圖片目錄:

$ cwebp -q 80 butterfly.jpg -o butterfly.webp

Saving file 'butterfly.webp'
File:   butterfly.jpg
Dimension: 1676 x 1418
Output: 208418 bytes Y-U-V-All-PSNR 41.00 43.99 44.95   41.87 dB
        (0.70 bpp)
block count:    intra4:     7644  (81.80%)
               Intra16:     1701  (18.20%)
               Skipped:       63  (0.67%)
bytes used:  header:            249  (0.1%)
              mode-partition:  36885  (17.7%)
Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
macroblocks:     |       8%|      22%|      26%|      44%|   9345
quantizer:       |      27 |      25 |      21 |      13 |
filter level:    |       8 |       6 |      19 |      16 |

如果您不在命令列上,Squoosh 也會提供 WebP 編碼服務。可讓我們並排比較不同編碼、設定、品質等級,以及 JPEG 編碼檔案大小差異。