用 mozjpeg 產生高效率的 JPEG

作者:
瀏覽:622

mozjpeg 最近釋出了 2.1 版,期待能針對現有編碼器而提升其 JPEG 編碼效率,也要能相容於目前主流的解碼器。

接著要說明該如何減少 JPEG 檔案大小,並使用 mozjpeg 的「cjpeg」指令列公用程式。

建立 mozjpeg

目前尚無正式的 mozjpeg 可執行版本,所以必須從原始碼建構自己的專案。可先下載最新版本的原始碼,再依照 BUILDING.txt 檔案中的說明逐步完成。

在 Linux 與 OS X 上很簡單。但在 Windows 上就有點複雜;不過相對來說還是簡單。而我們也正考慮未來將提供 mozjpeg 專案的可執行版本。

在建構 mozjpeg 時,就會產生所謂「cjpeg」的指令列工具,即是搭配 mozjpeg 的編碼程式;另外「djpeg」即解碼程式。

輸入圖像格式

cjpeg 工具可處理 targa、bmp、ppm、jpg 等輸入檔案類型。

「將 JPEG 檔案作為輸入結果」屬於 mozjpeg 的新功能,且其他專案所提供的 cjpeg 工具仍尚未支援此功能。此功能是為了達到更簡易的重複壓縮作業。如果不想將 JPEG 轉換為 BMP 或其他格式並重新進行編碼,則直接將 JPEG 送入 cjpeg 編碼器即可。

針對 cjpeg 並不支援的檔案類型,如果你仍想建立 JPEG 檔案的話,請參閱《ImageMagick 工具》。其內提供「convert」指令列公用程式,可來回轉換多種格式的圖像。

cjpeg 指令列工具的基本使用方式

許多人在使用「cjpeg」工具時,都是使用最簡易的形式:

$ cjpeg -quality 80 foo.bmp > bar.jpg

這種方式將根據「foo.bmp」輸入檔案,建立所謂「foo.jpg」的 JPEG 檔案,並達到 80 品質水準。cjpeg 將直接輸出最後的 JPEG 檔案內容。如果還要將該檔案寫入至磁碟 (你可能已經這樣做了),就必須透過「>」將結果輸出為檔案。

選擇品質水準 (Quality Level)

圖素品質分為 0 ~ 100,數字越大品質越佳。大多數人需要的圖素品質都落在 60 ~ 90 之間。因為較低圖素品質只是產生較小尺寸的圖像,所以就算原圖的品質不高,仍可達到讓你滿意的圖素品質。

下方圖像包含一幅原始圖檔,以及用 cjpeg 編碼而得的五幅不同品質水準圖檔。可點擊放大觀看。

用 mozjpeg 產生高效率的 JPEG

圖像出處:Soulmatesphotography, via Wikimedia, Creative Commons Attribution-Share Alike 3.0 Unported License

下方是各幅圖像的連結:

其實很多人錯失能大幅縮減檔案容量的機會。大家往往認為:「品質水準 80 看起來就不錯了,而且聽說大部分的人都用 80,我也就跟著用就可以」。但如果你無法分辨 77 與 80 的差異,這時只要稍稍做出改變,就能大幅降低檔案容量卻又能兼顧圖素品質。

基本 (Baseline) 對上漸進式 (Progressive) JPEG

mozjpeg 版本的 cjpeg 即預設產生漸進式 (Progressive) 的 JPEG 檔案,且可較基本 (Baseline) 的 JPEG 減少約 4% 檔案容量。漸進式 JPEG 雖然是先顯示模糊的圖素,但卻能先呈現完整的圖素尺寸,再逐步完成下載作業以提供完整解析度。基本 JPEG 檔案就是從頭到腳逐一載入圖素。

基本 JPEG:

用 mozjpeg 產生高效率的 JPEG

漸進式 JPEG:

用 mozjpeg 產生高效率的 JPEG

圖像出處:Soulmatesphotography, via Wikimedia, Creative Commons Attribution-Share Alike 3.0 Unported License

 

如果想產生基本 JPEG,可如下處理:

$ cjpeg -baseline -quality 80 foo.bmp > bar.jpg

品質矩陣

cjpeg 的絕妙功能之一,就是能針對 PSNR、PSNR-HVS-M、SSIM、MS-SSIM 共四種特殊的品質矩陣進行最佳化。這些矩陣均屬於演算法,可比較原始圖檔而計算圖像的品質。更精確的說,就是用來計算失真率 (Distortion rate)。

這些演算法定義品質的方式略有不同,因此只要針對其中一種矩陣最佳化,就會影響另一個矩陣的品質。可參閱 Mozilla 於 2014 年 7 月提出的壓縮圖像失真報告以進一步了解。

由於微調可對所有矩陣達到不錯的效果,mozjpeg 已經預設會對 PSNR-HVS-M 進行微調。

如果你或公司本來就慣用某個特定矩陣,你就知道 mozjpeg 的 cjpeg 工具絕對可以協助微調該矩陣。

結論

希望你看到這裡,已經能開始利用 mozjpeg 來最佳化自己的 JPEG 檔案。如果遇到任何問題,歡迎透過github 上的 mozjpeg 問題討論區回報。

 

 

原文連結:Using mozjpeg to Create Efficient JPEGs