轉載請註明出處,謝謝:http://blog.csdn.net/harryweasley/article/details/51955467html
android中圖片是以bitmap形式存在的,那麼bitmap所佔內存,直接影響到了應用所佔內存大小,首先要知道bitmap所佔內存大小計算方式:java
圖片長度 x 圖片寬度 x 一個像素點佔用的字節數android
如下是圖片的壓縮格式:微信
其中,A表明透明度;R表明紅色;G表明綠色;B表明藍色。app
ALPHA_8
表示8位Alpha位圖,即A=8,一個像素點佔用1個字節,它沒有顏色,只有透明度
ARGB_4444
表示16位ARGB位圖,即A=4,R=4,G=4,B=4,一個像素點佔4+4+4+4=16位,2個字節
ARGB_8888
表示32位ARGB位圖,即A=8,R=8,G=8,B=8,一個像素點佔8+8+8+8=32位,4個字節
RGB_565
表示16位RGB位圖,即R=5,G=6,B=5,它沒有透明度,一個像素點佔5+6+5=16位,2個字節測試
我是用的小米手機2s來測試的,從sd卡取出一個照片,以下所示:優化
[java] view plain copygoogle
出來的log是:
spa
將取得的bitmap進行壓縮,下面開始說,bitmap的幾種壓縮方式。.net
[java] view plain copy
其中quality是從edittext獲取的數字,能夠從0–100改變,這裏出來的log是:
能夠看到,圖片的大小是沒有變的,由於質量壓縮不會減小圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度等,來達到壓縮圖片的目的,這也是爲何該方法叫質量壓縮方法。那麼,圖片的長,寬,像素都不變,那麼bitmap所佔內存大小是不會變的。
可是咱們看到bytes.length是隨着quality變小而變小的。這樣適合去傳遞二進制的圖片數據,好比微信分享圖片,要傳入二進制數據過去,限制32kb以內。
這裏要說,若是是bit.compress(CompressFormat.PNG, quality, baos);這樣的png格式,quality就沒有做用了,bytes.length不會變化,由於png圖片是無損的,不能進行壓縮。
CompressFormat還有一個屬性是,CompressFormat.WEBP格式,該格式是google本身推出來一個圖片格式,更多信息,文末會貼出地址。
[java] view plain copy
出來的log是
設置inSampleSize的值(int類型)後,假如設爲2,則寬和高都爲原來的1/2,寬高都減小了,天然內存也下降了。
我上面的代碼沒用過options.inJustDecodeBounds = true; 由於我是固定來取樣的數據,爲何這個壓縮方法叫採樣率壓縮,是由於配合inJustDecodeBounds,先獲取圖片的寬、高【這個過程就是取樣】,而後經過獲取的寬高,動態的設置inSampleSize的值。
當inJustDecodeBounds設置爲true的時候,BitmapFactory經過decodeResource或者decodeFile解碼圖片時,將會返回空(null)的Bitmap對象,這樣能夠避免Bitmap的內存分配,可是它能夠返回Bitmap的寬度、高度以及MimeType。
[java] view plain copy
出來的log是
能夠看出來,bitmap的長度和寬度分別縮小了一半,圖片大小縮小了四分之一。
關於martix更多信息,文末會有一個參考文章。
[java] view plain copy
出來的log是:
咱們看到圖片大小直接縮小了一半,長度和寬度也沒有變,相比argb_8888減小了一半的內存。
注意:因爲ARGB_4444的畫質慘不忍睹,通常假如對圖片沒有透明度要求的話,能夠改爲RGB_565,相比ARGB_8888將節省一半的內存開銷。
[java] view plain copy
出來的log是
這裏是將圖片壓縮成用戶所指望的長度和寬度,可是這裏要說,若是用戶指望的長度和寬度和原圖長度寬度相差太多的話,圖片會很不清晰。
以上就是5種圖片壓縮的方法,這裏須要強調,他們的壓縮僅僅只是對android中的bitmap來講的。若是將這些壓縮後的bitmap另存爲sd中,他們的內存大小並不同。
android手機中,圖片的所佔的內存大小和不少因素相關,計算起來也很麻煩。爲了計算出一個圖片的內存大小,能夠將圖片當作一個文件來間接計算,用以下的方法:
[java] view plain copy
或者
[java] view plain copy
上面兩個方法計算的結果是同樣的。
看完了這篇內容,其實說白了,Bitmap壓縮都是圍繞這個來作文章:Bitmap所佔用的內存 = 圖片長度 x 圖片寬度 x 一個像素點佔用的字節數。3個參數,任意減小一個的值,就達到了壓縮的效果。
參考文章:
Android Bitmap 優化(1) - 圖片壓縮http://anany.me/2015/10/15/bitmap1/
多圖比較谷歌WebP和JPEG圖像格式http://www.win7china.com/html/8668.html
Android-使用Matrix對Bitmap進行處理http://blog.csdn.net/nupt123456789/article/details/24600055