Android開發中的圖像壓縮是一個很重要的部分。而這篇文章會讓咱們從另一個角度來認識Android平臺下的圖像壓縮和優化。android
這篇文章更適合和設計師一塊兒來看,因此,若是你和你的設計師是好基友的話,不妨叫上他,倒兩杯咖啡,花上幾分鐘...
...
...
其實主要有部分圖像專業處理上相關的知識,筆者並無去深刻介紹(能力有限),因此有設計師的幫助會讓你瞭解的更透徹。git
平常咱們在Android開發中接觸到的圖像,主要有如下四種格式:github
1. PNG
PNG的名稱來源於「可移植網絡圖形格式(Portable Network Graphic Format,PNG)」,PNG用來存儲灰度圖像時,灰度圖像的深度可多到16位,存儲彩色圖像時,彩色圖像的深度可多到48位,而且還可存儲多到16位的α通道數據。PNG使用從LZ77派生的無損數據壓縮算法,通常應用於JAVA程序、網頁或S60程序中,緣由是它壓縮比高,生成文件體積小。算法
2. VectorDrawable
Android 平臺的矢量圖形 。性能優化
3. JPG
JPG全名是JPEG。JPEG圖片以 24 位顏色存儲單個位圖。JPEG 是與平臺無關的格式,支持最高級別的壓縮,不過,這種壓縮是有損耗的。漸近式 JPEG 文件支持交錯。服務器
4. WebP格式
谷歌(Google)開發的一種旨在加快圖片加載速度的圖片格式。圖片壓縮體積大約只有JPEG的2/3,並能節省大量的服務器帶寬資源和數據空間。Facebook Ebay等知名網站已經開始測試並使用WebP格式。網絡
本文所說的圖像壓縮就是關於以上這四種格式less
PNG圖像是Android開發中使用的比較普遍的,而它的壓縮和優化的方式也相應比較多。svg
1. AAPT
aapt全稱Android Asset Packaging Tool,直譯的話,就是Android資源打包工具,這是Android官方提供的一個打包工具,而它在將咱們的Android項目打包成apk的過程當中,已經自動幫咱們完成了一次對於PNG圖片的壓縮處理,有興趣的同窗,能夠將Android項目源碼中的資源圖片與apk中解壓出來的資源圖片的大小對比一下,你會發現apk中的圖片會比咱們源碼中的圖片要小,我相信不少小夥伴都沒有注意到這一點吧 :)工具
而在官方視頻中的介紹,aapt工具對於圖像壓縮只作了三件事:specifically , no more , no less
簡單來講的話就是對圖像進行了二次處理,以下圖所示:
2. 下降圖像色彩位數
若是你的圖像文件的色彩比較單一,那麼你能夠經過下降圖像的位數來進行壓縮,以下圖所示:
注意:下降色彩位數的前提是,並不會影響用戶對圖像的觀看。
3. PNG 壓縮優化工具
網上有不少關於PNG格式的壓縮優化工具,你能夠到Google上搜索 PNG Optimizer ,會出來不少相關的資料。
另外Google官方也有一個開源的項目Zopfli,是deflate壓縮算法的另外一種實現。
這裏須要注意的是,有時候經過其餘工具壓縮後的PNG圖像,再通過aapt工具的壓縮,恩,那應該會更小?
WTF !!!
別急,這裏須要對Gradle文件添加一行配置:
這裏推薦一個插件img-optimizer-gradle-plugin,一款用於優化png圖片的gradle插件,有效減小APK體積,支持極限壓縮和無損壓縮。
4. 經過代碼來代替PNG圖
假設你有一個圓形的圖像須要展現很用戶,若是使用PNG圖片的話:
若是你經過代碼畫出來:
沒有對比,就沒有傷害。
5. 矢量圖代替PNG圖
關於用矢量圖去代替PNG,官方視頻中介紹了一個位圖轉換爲矢量圖的工具Potrace 。
矢量圖一樣也能夠再通過處理轉換成VectorDrawable格式,而size會進一步變小。這裏有一個開源庫svg2android,能夠將svg轉換爲VectorDrawable 。
VectorDrawable(矢量圖形)是Android官方推出一個新的特性,爲咱們提供了添加複雜矢量圖形的強大功能,同時也提供了動畫顯示這些圖形的方法。矢量圖形的好處是放大不會失真,能夠適應不一樣分辨率的屏幕。因此,它是你圖像壓縮和優化的首選,儘量的去使用吧。
關於VectorDrawable的介紹和使用,這裏不作過多的介紹。
當談到關於JPG的圖像的時候,官方視頻中的講解者Colt McAnlis如是說到:
By the way ,Colt McAnlis的視頻講解很是富有激情,也很幽默,我我的比較喜歡他。Google 官方的Android Performance Patterns(性能優化視頻)合集中有不少是由他來說解的,因此強烈推薦有興趣的同窗去看看。
JPG相對於PNG格式的圖像,更加複雜,因此通常不推薦直接使用JPG圖像。關於JPG圖像的壓縮方式有如下幾種:
1. 下降JPG圖像的質量
以上兩張圖片,經過將圖片的質量下降,圖片大小由263k減小到25k,壓縮的很是可觀,固然並非全部的JPG圖像都適用這種下降質量的方式,由於首先,你須要在保證在不影響人肉眼觀看的效果的前提下,再去下降圖像的質量。
可是,這裏會出現一個問題,若是你有不少張這樣的圖片,而後你手動的一個個經過比對去下降,這樣的效率會很是低下。因此官方視頻中爲這種方式提供了一個圖像質量適用規則:
2. JPG 壓縮優化工具
一樣的,網上關於JPG圖像的一些壓縮優化工具也不少,你能夠Google搜索下JPG Optimizer
谷歌(Google)開發的一種旨在加快圖片加載速度的圖片格式,因此,強烈推薦使用WebP圖像來替換PNG和JPG圖像。
另外推薦一個開源庫WebpifyYourAndroidApp,能夠將PNG或者JPG轉換爲WebP圖像。
若是你以爲以上內容太多,記不住的話, 不要緊,官方視頻爲咱們提供一張總結圖:
簡單來講,從圖像壓縮和優化的角度來看的話,當你在選擇圖像的時候,應當考慮的優先級以下:
VectorDrawable>WebP>PNG>JPG
另:由於本文涉及到不少有關圖像相關的專業知識,若是有錯誤的地方,歡迎指出 :)