Google IO 2016 筆記之圖像壓縮

2018-06-06 14:23 更新

寫在前面

Android開發(fā)中的圖像壓縮是一個很重要的部分。而這篇文章會讓我們從另外一個角度來認識Android平臺下的圖像壓縮和優(yōu)化。

這篇文章更適合和設計師一起來看,所以,如果你和你的設計師是好基友的話,不妨叫上他,倒兩杯咖啡,花上幾分鐘... ... ... 其實主要有部分圖像專業(yè)處理上相關(guān)的知識,筆者并沒有去深入介紹(能力有限),所以有設計師的幫助會讓你了解的更透徹。

<!-- more -->

簡介

日常我們在Android開發(fā)中接觸到的圖像,主要有以下四種格式:

1.png

1. PNG PNG的名稱來源于“可移植網(wǎng)絡圖形格式(Portable Network Graphic Format,PNG)”,PNG用來存儲灰度圖像時,灰度圖像的深度可多到16位,存儲彩色圖像時,彩色圖像的深度可多到48位,并且還可存儲多到16位的α通道數(shù)據(jù)。PNG使用從LZ77派生的無損數(shù)據(jù)壓縮算法,一般應用于JAVA程序、網(wǎng)頁或S60程序中,原因是它壓縮比高,生成文件體積小。

2. VectorDrawable Android 平臺的矢量圖形 。

3. JPG JPG全名是JPEG。JPEG圖片以 24 位顏色存儲單個位圖。JPEG 是與平臺無關(guān)的格式,支持最高級別的壓縮,不過,這種壓縮是有損耗的。漸近式 JPEG 文件支持交錯。

4. WebP格式 谷歌Google)開發(fā)的一種旨在加快圖片加載速度的圖片格式。圖片壓縮體積大約只有JPEG的2/3,并能節(jié)省大量的服務器帶寬資源和數(shù)據(jù)空間。Facebook Ebay等知名網(wǎng)站已經(jīng)開始測試并使用WebP格式。

本文所說的圖像壓縮就是關(guān)于以上這四種格式

關(guān)于PNG圖像的壓縮

PNG圖像是Android開發(fā)中使用的比較廣泛的,而它的壓縮和優(yōu)化的方式也相應比較多。

1. AAPT aapt全稱Android Asset Packaging Tool,直譯的話,就是Android資源打包工具,這是Android官方提供的一個打包工具,而它在將我們的Android項目打包成apk的過程中,已經(jīng)自動幫我們完成了一次對于PNG圖片的壓縮處理,有興趣的同學,可以將Android項目源碼中的資源圖片與apk中解壓出來的資源圖片的大小對比一下,你會發(fā)現(xiàn)apk中的圖片會比我們源碼中的圖片要小,我相信很多小伙伴都沒有注意到這一點吧 :)

而在官方視頻中的介紹,aapt工具對于圖像壓縮只做了三件事:specifically , no more , no less 簡單來說的話就是對圖像進行了二次處理,如下圖所示:

2.png

2. 降低圖像色彩位數(shù) 如果你的圖像文件的色彩比較單一,那么你可以通過降低圖像的位數(shù)來進行壓縮,如下圖所示:

3.png

注意:降低色彩位數(shù)的前提是,并不會影響用戶對圖像的觀看。

3. PNG 壓縮優(yōu)化工具 網(wǎng)上有很多關(guān)于PNG格式的壓縮優(yōu)化工具,你可以到Google上搜索 PNG Optimizer ,會出來很多相關(guān)的資料。 另外Google官方也有一個開源的項目Zopfli,是deflate壓縮算法的另一種實現(xiàn)。 這里需要注意的是,有時候通過其他工具壓縮后的PNG圖像,再經(jīng)過aapt工具的壓縮,恩,那應該會更???

4.png

WTF !!!

別急,這里需要對Gradle文件添加一行配置:

5.png

這里推薦一個插件img-optimizer-gradle-plugin,一款用于優(yōu)化png圖片的gradle插件,有效減少APK體積,支持極限壓縮和無損壓縮。

4. 通過代碼來代替PNG圖 假設你有一個圓形的圖像需要展示很用戶,如果使用PNG圖片的話:

6.png

如果你通過代碼畫出來:

7.png

沒有對比,就沒有傷害。

5. 矢量圖代替PNG圖

關(guān)于用矢量圖去代替PNG,官方視頻中介紹了一個位圖轉(zhuǎn)換為矢量圖的工具Potrace 。

8.png

矢量圖同樣也可以再經(jīng)過處理轉(zhuǎn)換成VectorDrawable格式,而size會進一步變小。這里有一個開源庫svg2android,可以將svg轉(zhuǎn)換為VectorDrawable 。

關(guān)于VectorDrawable

VectorDrawable(矢量圖形)是Android官方推出一個新的特性,為我們提供了添加復雜矢量圖形的強大功能,同時也提供了動畫顯示這些圖形的方法。矢量圖形的好處是放大不會失真,可以適應不同分辨率的屏幕。所以,它是你圖像壓縮和優(yōu)化的首選,盡可能的去使用吧。

關(guān)于VectorDrawable的介紹和使用,這里不做過多的介紹。

關(guān)于JPG圖像的壓縮

當談到關(guān)于JPG的圖像的時候,官方視頻中的講解者Colt McAnlis如是說到: 9.png

By the way ,Colt McAnlis的視頻講解非常富有激情,也很幽默,我個人比較喜歡他。Google 官方的Android Performance Patterns(性能優(yōu)化視頻)合集中有很多是由他來講解的,所以強烈推薦有興趣的同學去看看。

JPG相對于PNG格式的圖像,更加復雜,所以一般不推薦直接使用JPG圖像。關(guān)于JPG圖像的壓縮方式有以下幾種:

1. 降低JPG圖像的質(zhì)量

10.png

11.png

以上兩張圖片,通過將圖片的質(zhì)量降低,圖片大小由263k減少到25k,壓縮的非??捎^,當然并不是所有的JPG圖像都適用這種降低質(zhì)量的方式,因為首先,你需要在保證在不影響人肉眼觀看的效果的前提下,再去降低圖像的質(zhì)量。

但是,這里會出現(xiàn)一個問題,如果你有很多張這樣的圖片,然后你手動的一個個通過比對去降低,這樣的效率會非常低下。所以官方視頻中為這種方式提供了一個圖像質(zhì)量適用規(guī)則:

12.png

2. JPG 壓縮優(yōu)化工具

同樣的,網(wǎng)上關(guān)于JPG圖像的一些壓縮優(yōu)化工具也很多,你可以Google搜索下JPG Optimizer

13.png

關(guān)于WebP

谷歌Google)開發(fā)的一種旨在加快圖片加載速度的圖片格式,所以,強烈推薦使用WebP圖像來替換PNG和JPG圖像。

另外推薦一個開源庫WebpifyYourAndroidApp,可以將PNG或者JPG轉(zhuǎn)換為WebP圖像。

最后

如果你覺得以上內(nèi)容太多,記不住的話, 沒關(guān)系,官方視頻為我們提供一張總結(jié)圖:

14.png

簡單來說,從圖像壓縮和優(yōu)化的角度來看的話,當你在選擇圖像的時候,應當考慮的優(yōu)先級如下: VectorDrawable>WebP>PNG>JPG

另:因為本文涉及到很多有關(guān)圖像相關(guān)的專業(yè)知識,如果有錯誤的地方,歡迎指出 :)

參考

Image compression for Android developers - Google I/O 2016

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號