圖片格式:WebP

Google 最初開發 WebP 時是有損圖片格式,用來取代 JPEG,這種格式可產生小於 編碼成 JPEG 的高品質圖片檔案。之後對格式進行更新時,加入無損壓縮選項 類似 PNG 的 Alpha 通道透明度和類 GIF 動畫,這些都可以與 JPEG 樣式的有損壓縮搭配使用。 WebP 是不可避免的多功能格式。

WebP 的有損壓縮演算法是根據 VP8 影片轉碼器的方法 來壓縮影片中的主要畫面格大致上與 JPEG 編碼類似:WebP 的執行依據是「區塊」而非個別像素 且亮度與色度相近。WebP 的亮度區塊大小為 16x16,色塊則是 8x8 和「macroblocks」是 再細分為 4x4 子區塊

WebP 與 JPEG 的明顯差異在於兩大特性:「封鎖預測」以及「適應性區塊量化」

區塊預測是依據各個色度與亮度區塊內容進行預測的程序 也就是目前區塊上方和左側的區塊。正如您所想的 這方面的工作相當複雜,但要講究淺顯易懂的文字:「如果目前區塊上方有藍色字樣,左側為藍色 假設這個區塊是藍色的

事實上,PNG 和 JPEG 都是以「某種」度進行預測。然而,WebP 的特別之處在於它會對周圍環境進行取樣 方塊然後嘗試透過多種不同的「預測模式」填入目前的區塊,有效試著「繪製」 圖片缺少的部分接著,系統會將每個預測模式提供的結果與實際圖片資料進行比較,找出最接近的結果 已選取預測比對。

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

當然,即使最接近預測查詢字串的結果並不完全正確,所以預測值與預測查詢字串之間 該區塊的實際值都會編碼在檔案中。解碼圖片時,算繪引擎會使用相同資料來套用 使用相同的預測邏輯,為每個區塊帶來相同的預測值。預測結果和預測結果之間的差異 檔案編碼的預期圖像會套用在預測上,類似於 Git 修訂版本代表差異 修補程式會套用於本機檔案,而不是新的檔案副本。

說明:我們不會深入瞭解真實預測演算法所涉及的複雜數學,而是改造出類似 WebP 的編碼 搭配單一預測模式,就能像我們和舊版格式一樣,有效率地轉發一串數字。我們的演算法 只有一個預測模式,我們將該模式稱為「預測模式 1」:每個區塊的值就是以上區塊值的總和 左邊和左邊的,從 1 開始

現在,假設我們從下列真實的圖像資料開始著手:

111151111
122456389

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

111111111
123456789

我們的資料相當適合用來開發 Google 發明的預測演算法,因為預測的資料與我們的實際資料高度相符。 當然,這並不是完美工具,實際資料中會有數個區塊,與預測資料不同。編碼器-解碼器 我們傳送的區塊不僅包括要使用的預測方法,還會提供其他區塊應與預測值的差異:

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

使用與我們先前討論過的部分舊格式編碼相同的簡單語言:

採用預測模式 1 的 2x9 方格+4 到 1x5,-1 到 2x3,-4 到 2x7。

最終會產生無法預期的編碼檔案。

自動調整區塊量化

JPEG 壓縮是一種全面性的運算,會對圖像中的每個區塊套用相同等級的量化。在圖片中 使用統一的構圖就沒有問題,但現實生活中的相片絕對比我們周圍世界更統一。 實務上,這表示 JPEG 壓縮設定並非由高頻率的細節決定,其中 JPEG 壓縮功能極佳—但圖片中最常出現壓縮成果的部分。

壓縮的 JPEG 圖片,顯示帝王蝶

在這個誇張的範例中,前景中的君王翅膀看起來較為清晰 — 有點微小的顆粒 不過,若與高解析度原始影片相較,甚至無法與原始相片進行比較。 同樣地,在前景中,牛奶和前景的葉片細緻的化作用,您和我可能會看到壓縮的痕跡 我們訓練的眼睛也能顯現出不真實的一面,即使壓縮率遠遠超出前景中合理等級的物體 看起來還是很清晰相片左上方的低頻率資訊 (背景是模糊的綠色背景) 糟糕。即使是未經訓練的檢視器,也會立即註意到品質問題,因為背景中的細微漸層會 四捨五入為鋸齒狀的實色區塊。

為避免這種情況,WebP 會採用「自動調整」方法來量化:將圖片分割為最多四個外觀相似的圖片 和這些區隔的壓縮參數對 WebP 使用相同大小的壓縮:

壓縮的 WebP 蝴蝶蝴蝶圖片

這兩個圖片檔的大小大致相同。搜尋國王的翅膀時,品質都差不多 因此,如果您看起來非常嚴格,但整體品質並沒有實質上的差異,最終結果可能會出現一些細微差異。 在 WebP 中,牛奶的花朵只是微小的銳利變化,除非你沒有 並且真正研究品質差異,也是我們自己想到的。背景是不同故事 它幾乎沒有一塊明顯的 JPEG 明顯的證據。WebP 的檔案大小相同,但比 編輯高品質的圖片 - 張貼或記下一些細微細節,在精神視覺系統無法相互比較的情況下 這兩個概念非常密切

使用 WebP

WebP 的內部構造可能比 JPEG 編碼要大得多,但就和我們日常用途一樣簡單 作業:WebP 的所有編碼複雜度都會根據單一「品質」標準化值,以 0 到 100 表示,就像 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 編碼的差異,並列比較。