Android開發(fā)中的圖像壓縮是一個很重要的部分。而這篇文章會讓我們從另外一個角度來認識Android平臺下的圖像壓縮和優(yōu)化。
這篇文章更適合和設計師一起來看,所以,如果你和你的設計師是好基友的話,不妨叫上他,倒兩杯咖啡,花上幾分鐘... ... ... 其實主要有部分圖像專業(yè)處理上相關(guān)的知識,筆者并沒有去深入介紹(能力有限),所以有設計師的幫助會讓你了解的更透徹。
<!-- more -->
日常我們在Android開發(fā)中接觸到的圖像,主要有以下四種格式:
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)于以上這四種格式
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. 降低圖像色彩位數(shù) 如果你的圖像文件的色彩比較單一,那么你可以通過降低圖像的位數(shù)來進行壓縮,如下圖所示:
注意:降低色彩位數(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工具的壓縮,恩,那應該會更???
WTF !!!
別急,這里需要對Gradle文件添加一行配置:
這里推薦一個插件img-optimizer-gradle-plugin,一款用于優(yōu)化png圖片的gradle插件,有效減少APK體積,支持極限壓縮和無損壓縮。
4. 通過代碼來代替PNG圖 假設你有一個圓形的圖像需要展示很用戶,如果使用PNG圖片的話:
如果你通過代碼畫出來:
沒有對比,就沒有傷害。
5. 矢量圖代替PNG圖
關(guān)于用矢量圖去代替PNG,官方視頻中介紹了一個位圖轉(zhuǎn)換為矢量圖的工具Potrace 。
矢量圖同樣也可以再經(jīng)過處理轉(zhuǎn)換成VectorDrawable格式,而size會進一步變小。這里有一個開源庫svg2android,可以將svg轉(zhuǎn)換為VectorDrawable 。
VectorDrawable(矢量圖形)是Android官方推出一個新的特性,為我們提供了添加復雜矢量圖形的強大功能,同時也提供了動畫顯示這些圖形的方法。矢量圖形的好處是放大不會失真,可以適應不同分辨率的屏幕。所以,它是你圖像壓縮和優(yōu)化的首選,盡可能的去使用吧。
關(guān)于VectorDrawable的介紹和使用,這里不做過多的介紹。
當談到關(guān)于JPG的圖像的時候,官方視頻中的講解者Colt McAnlis如是說到:
By the way ,Colt McAnlis的視頻講解非常富有激情,也很幽默,我個人比較喜歡他。Google 官方的Android Performance Patterns(性能優(yōu)化視頻)合集中有很多是由他來講解的,所以強烈推薦有興趣的同學去看看。
JPG相對于PNG格式的圖像,更加復雜,所以一般不推薦直接使用JPG圖像。關(guān)于JPG圖像的壓縮方式有以下幾種:
1. 降低JPG圖像的質(zhì)量
以上兩張圖片,通過將圖片的質(zhì)量降低,圖片大小由263k減少到25k,壓縮的非??捎^,當然并不是所有的JPG圖像都適用這種降低質(zhì)量的方式,因為首先,你需要在保證在不影響人肉眼觀看的效果的前提下,再去降低圖像的質(zhì)量。
但是,這里會出現(xiàn)一個問題,如果你有很多張這樣的圖片,然后你手動的一個個通過比對去降低,這樣的效率會非常低下。所以官方視頻中為這種方式提供了一個圖像質(zhì)量適用規(guī)則:
2. JPG 壓縮優(yōu)化工具
同樣的,網(wǎng)上關(guān)于JPG圖像的一些壓縮優(yōu)化工具也很多,你可以Google搜索下JPG Optimizer
谷歌(Google)開發(fā)的一種旨在加快圖片加載速度的圖片格式,所以,強烈推薦使用WebP圖像來替換PNG和JPG圖像。
另外推薦一個開源庫WebpifyYourAndroidApp,可以將PNG或者JPG轉(zhuǎn)換為WebP圖像。
如果你覺得以上內(nèi)容太多,記不住的話, 沒關(guān)系,官方視頻為我們提供一張總結(jié)圖:
簡單來說,從圖像壓縮和優(yōu)化的角度來看的話,當你在選擇圖像的時候,應當考慮的優(yōu)先級如下: VectorDrawable>WebP>PNG>JPG
另:因為本文涉及到很多有關(guān)圖像相關(guān)的專業(yè)知識,如果有錯誤的地方,歡迎指出 :)
更多建議: