Liang2's Blog

About | Talks | Archives

PNG Optimizer

部落格剛成立總是特別興奮,測了一下瀏覽像這樣的網站要用多少頻寬。首頁能壓在 600KB 左右,因為文章 summary 裡面暫時還沒圖。不過像部落格設定這篇文章,裡面有幾張螢幕截圖的就要花快 2MB 傳。

就想了一下圖檔有什麼壓縮方式。如果是 JPG 的話,jpegoptim 簡單又有效;如果是 PNG 的話,以前都是用 OptiPNG,但效果有限,而且是無損壓縮。在螢幕截圖的情況,我倒不介意幾個像素的顏色稍微不一樣(其實人眼無法分辨)

於是,需要比較看看市面找得到的幾種 PNG 壓縮方式。很碰巧找到 http://css-ig.net/png-tools-overview.html 專講 PNG 優化的比較,就挑了幾款來試。

直接把結果整理成下表:

Filename Original size OptiPNG (lossless) Zopfli (lossless) pngquant (lossy)
blog_desktop.png 180K 108K 100K 56K
blog_mobile.png 72K 52K 44K 28K
justfont_setting.png 272K 196K 164K 84K
oldsite.png 604K 536K 492K 288K
oldsite_full.png 816K 684K 644K 376K

OptiPNG

OptiPNG 還是有部份效果,不過他跑不快。

Zopfli (Zopflipng)

Zopfli 是 Google 開發的壓縮演算法,相容於 deflate, gzip, zlib 格式。也因此能用在 PNG 上面。他也是 lossless compression。

Zopfli Compression Algorithm is a compression library programmed in C to perform very good, but slow, deflate or zlib compression. (Zopfli Readme)

這個 Zopflipng 也是同個 repo 維護。自己編譯簡單,

git clone https://github.com/google/zopfli.git
make zopflipng

如果要一口氣壓縮一堆 PNG,可以這樣使用:

zopflipng --lossy_transparent --prefix *.png

速度也蠻慢的,有個 -q 選項可以加速。但壓縮效率比 OptiPNG 還好。

PS 剛好今天早上看到 Google 又出了另一個壓縮演算法 Brotli,但這個與 deflate 不相容,應該不能用在 PNG 上面。

pngquant

想要有損的 PNG 可以用 pngquant。看官網有特別強調在透明度的資訊會被保留,並能像 JPEG 一樣設定 quality。一般 quality 容許越低壓縮比都會越高。

pngquant -f --ext=.png --quality=70-85 --skip-if-larger *.png

可以看到 pngquant 能很容易達到 50% 以下的壓縮比。就我的例子看不太出現螢幕截圖哪裡失真了,而且失真了……也不會怎麼樣啦。

pngquant + Zopflipng

看了一下相關的討論,pngquant 還有再被壓縮的空間,所以最後再套上 Zopflipng 還可以再變小,還蠻驚人的。

Filename Orig. size pngquant pngquant + Zopfli Compress ratio
blog_desktop.png 180K 56K 60K 0.33
blog_mobile.png 72K 28K 28K 0.39
justfont_setting.png 272K 84K 76K 0.28
oldsite.png 604K 288K 268K 0.44
oldsite_full.png 816K 376K 348K 0.43

沒有測的 TruePNG

在原始網站中有提到 TruePNG 表現很好,但它不是 open source 而且好像只能在 Windows 上跑,那就算了。

結論

以後沒事截圖都會用 pngquant 壓縮一下,完全不能有色差的考慮從 OptiPNG 改為 Zopfli。