Android圖片壓縮
在我們做專案中,為了減少圖片佔用的記憶體,就需要把圖片給進行壓縮,而圖片在我們Android裡又是以bitmap形式存在,所以我們要對bitmap進行壓縮,首先要知道bitmap的記憶體佔用的計算公式。計算公式:長度×寬度×1畫素佔用的位元組數
bitmap壓縮有四種方式:
Bitmap.config ALPHA_8 表示8位Alpha點陣圖,即A=8,一個畫素點佔用1個位元組,它沒有顏色,只有透明度
Bitmap.config ARGB_4444 表示16位ARGB點陣圖,即A=4,R=4,G=4,B=4,一個畫素點佔4+4+4+4=16位,2個位元組
Bitmap.config ARGB_8888 表示32位ARGB點陣圖,即A=8,R=8,G=8,B=8,一個畫素點佔8+8+8+8=32位,4個位元組
Bitmap.config RGB_565 表示16位RGB點陣圖,即R=5,G=6,B=5,它沒有透明度,一個畫素點佔5+6+5=16位,2個位元組
ps: A(alpha)透明 R(red)紅色 G(green)綠色 B(blue)藍色
程式碼說明:
//獲取一張圖片,進行壓縮 bit = BitmapFactory.decodeFile(Environment .getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera/test.jpg"); Log.i("wechat", "壓縮前圖片的大小" + (bit.getByteCount() / 1024 / 1024) + "M寬度為" + bit.getWidth() + "高度為" + bit.getHeight());
bitmap共計五種壓縮方式,接下來就依次說一下。
1.質量壓縮
經過質量壓縮的圖片大小不會改變因為質量壓縮不會減少圖片的畫素 ,它是在保持畫素的前提下改變圖片的位深及透明度等屬性來達到壓縮圖片的目的,所以說這個方法叫質量壓縮,既然圖片的長寬和畫素都不變,那麼bitmap佔用的記憶體大小也是不會改變的。
ps:如果圖片是png模式那麼長度就不會變化,因為png是無損的,不能進行壓縮。
2.取樣率壓縮
在我們設定了inSampleSize的值(int型別)後,如果inSampleSize=4,那麼寬高都是原來的1/4,既然寬高都減少了,記憶體自然也就降低了
為什麼這個壓縮方法叫取樣率壓縮呢?是因為配合inJustDecodeBounds,先獲取圖片的寬、高(取樣的一個過程),然後通過獲取的寬高,動態的設定inSampleSize的值。
3.縮放法壓縮(martix)
程式碼說明:
Matrix matrix = new Matrix();
//寬高都為原來的1/2, 所以結果就會為0.5*0.5=1/4
matrix.setScale(0.5f, 0.5f);
bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),
bit.getHeight(), matrix, true);
Log.i("wechat", "壓縮後圖片的大小" + (bm.getByteCount() / 1024 / 1024)
+ "M寬度為" + bm.getWidth() + "高度為" + bm.getHeight());
bitmap的長度和寬度分別縮小了一半,圖片大小縮小了四分之一。
4.RGB_565法
程式碼說明:
BitmapFactory.Options options2 = new BitmapFactory.Options();
options2.inPreferredConfig = Bitmap.Config.RGB_565;
//獲取圖片
bm = BitmapFactory.decodeFile(Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/DCIM/Camera/test.jpg", options2);
//壓縮後的大小
Log.i("wechat", "壓縮後圖片的大小" + (bm.getByteCount() / 1024 / 1024)
+ "M寬度為" + bm.getWidth() + "高度為" + bm.getHeight());
從上邊的程式碼可以看出圖片大小直接縮小了一半,長度和寬度也沒有變,相比argb_8888減少了一半的記憶體。
ps:由於ARGB_4444的畫質很low所以如果沒有對圖片有透明度要求的話可以改為RGB_565,相比ARGB_8888會少佔用一半的記憶體
5.createScaledBitmap
程式碼說明:
//給出固定的寬高值
bm = Bitmap.createScaledBitmap(bit, 150, 150, true);
Log.i("wechat", "壓縮後圖片的大小" + (bm.getByteCount() / 1024) + "KB寬度為"
+ bm.getWidth() + "高度為" + bm.getHeight());
ps:這個是將圖片壓縮為使用者設定的長寬度,如果設定的和原本的相差太多,圖片會很不清晰。