2015年12月3日 星期四

壓縮 PNG 利器 pngquant

替客人開發的一個簡單 Android 應用程式約 32MB。客人要求把體積減半。有這個大小,是因為當中包含 drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi 四組尺寸的圖案。減磅的方法不外乎刪除部份尺寸,或把圖檔縮小。雙管齊下當然最有效。因此把 drawable-xxhdpi 砍掉,再把所有圖檔縮小。

往常用開的 PNGshrink 能把 PNG 內多餘的內容除去,如:印表機資料、參考線資料、軟件資料...等。效果不差,但今次的幫助有限。其實 PNG 格式除了用上述的方法外,還能用 Indexed Color 來處理。一個正常的 32-bits PNG 包含了 RGBA 層,亦即是紅、綠、藍及遮罩層。每層色深為 8-bits。而 Indexed Color 則只有一層,同樣是 8-bits,意味著體積能省下 75% 空間。是非常有效率的做法。在現實世界裡,可沒有這麼便宜的東西,需要等價交換。一般 Indexed Color 是指最多可以有 256 色,如果有透明的話則 255 色,因為有一格顏色資料拿來當成透明色。問題是 Indexed Color 下的透明處理,不是全實色,就是全透明,沒有半透明之類的做法。對於 32-bits RGBA 圖來說,轉換出來的圖將會變醜。但 PNG 的 Indexed Color 格式解放了這個限制,可以有半透明色的存在。是一個空間與美觀性價比最高的做法。要生成這樣的 PNG,可以用 pngquant 來達成。它是以指令形式執行,而且支援 Wildcard,用起上來十分方便。

經過 pngquant 處理後,應用程式的體積縮減至 19MB。客人也很滿意。

沒有留言: