從事安卓開發也有幾年了,本人喜歡開門見山,此篇文章是處理以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
寫了這么多希望對每個需要圖片處理的童鞋有所幫助,收藏一波走起吧!