安卓關於圖片壓縮的那些事兒,希望給每個安卓開發人員一些幫助

Sthilly斌發表於2017-09-19

從事安卓開發也有幾年了,本人喜歡開門見山,此篇文章是處理以java語言下的安卓開發過程中圖片壓縮問題。

圖片載入在我們的開發過程中都是一個記憶體大戶,以至於我們載入每一個圖片bitmap物件的時候都應該進行回收以減少記憶體的佔用,而如果單張圖片的大小載入在記憶體都會造成oom記憶體溢位,那麼只是單純的回收就沒辦法解決了。我們就會涉及到圖片壓縮。我總結了幾種圖片壓縮的方式和圖片佔記憶體的形式,供大家參考。 有人說一張圖片也就幾mb,而手機記憶體有1G-8G,為什麼會記憶體溢位呢?這就要從圖片佔用記憶體的形式說起了。

圖片是由畫素點組成的,我們常見的解析度1920乘1080,960乘720,2560乘1400等,其實就是指螢幕橫向或者縱向有多少個畫素點,正常手機上如果圖片畫素密度過大,佔用的記憶體也就會相應的大。圖片也是一樣。以尺寸 800乘400為例,圖片佔用記憶體就是800乘400乘每個畫素點佔用的位元組數。那麼每個畫素佔用多少記憶體呢?這就涉及到圖片畫素的點陣圖位數。一般情況下我們只需考慮這四種模式。

ALPHA_8就是Alpha由8位組成 ARGB_4444就是由4個4位組成即16位, ARGB_8888就是由4個8位組成即32位, RGB_565就是R為5位,G為6位,B為5位共16位。 不要問我ARGB-8888為什麼是三十二位,因為四八三十二。 眾所周知一個位元組的儲存單位能儲存8位,所以以最佔記憶體的ARGB-8888為 例這種模式下一個畫素點會佔用4個位元組。也就是說,總佔用記憶體數量為 800乘480乘4=1536000位元組=1536kb=1.536mb。將ARGB-8888轉換為RGB-565, 就可以降低一半的記憶體消耗,但是會損失透明度,在你不需要透明度的情 況下,就可以這樣處理。這樣不會損失清晰度。這就是第一種壓縮方法。

第二種壓縮方法也是比較常見的,bitmap的自適應壓縮。也就是說,如果圖片是8000乘4000,而手機螢幕控制元件需要的只有800乘400,那麼我就需要將圖片的長和寬壓縮到原來的1/10,這樣記憶體佔用減少到原來的1/100,具體方法就是bitmap工廠建立bitmap物件的時候加上一個自己設定的options,並且options通過這個方法,

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height

/ (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }

去動態計算需要壓縮的倍數,這樣就可以在視野範圍內對圖片進行無失真壓縮,但是如果你要放大,就不行了。

第三種方法,這裡放上一個連結,https://github.com/Curzibn/Luban

這是Curzibn大神寫的一個,仿照微信的一個壓縮圖片的方法,實測可以將10m左右的圖片壓縮到1m以下,不放很大看看不出損失清晰度的,具體就是寫了一個演算法吧,大神的程式碼我就不多解釋評價了。

第四種,也是我之前找到的一個專門用來壓縮圖片的框架,叫NativeImgCompress的一個強大的壓縮圖片框架,github上能下載,地址是https://github.com/lichao3140/NativeImgCompress1

開啟jar包裡面是ndk寫的 jni方法呼叫C語言演算法的東西,總之非常強大。 最近想給我和我老婆寫一個結婚照的app記錄一下我們的一生,就用的這個壓縮方法壓縮的圖片,很強大,用法核心程式碼就這一行 NativeUtil.compressBitmap(File1, File2, 50);就可以把原路徑的圖片轉存到新路徑,你的10m圖片就變成幾百k了,當然50是可以調整的。

推薦採用第三種第四種,因為不僅可以減少記憶體的佔用,也可以減少apk安裝包的大小,瘦身還是開發者都需要的。 另外推薦一下一個原創帖子,apk瘦身圖片資源優化處理 http://blog.csdn.net/chzphoenix/article/details/75227590

寫了這麼多希望對每個需要圖片處理的童鞋有所幫助,收藏一波走起吧!

相關文章