Android-Bitmap壓縮總結

Bitmap佔用內存 = 長 X 寬 X 1個像素所佔字節,降低任意參數就可減少Bitmap佔用內存!

一、質量壓縮bitmap.compress(···quality···)


ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 10, baos);
byte[] bytes = baos.toByteArray();
/*
bitmap.compress(CompressFormat.JPEG, 10, baos)只是改變位深及透明度,沒有改變長、寬和1個像素所佔字節,
BitmapFactory.decodeByteArray(bytes, 0, bytes.length)也沒有改變長寬像素,故bitmap佔用內存不變,
但bytes本身變小了,適合存儲和傳輸!
*/
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

二、取樣壓縮BitmapFactory.decode···(···options)


BitmapFactory.Options options = new BitmapFactory.Options();
/* 
ALPHA_8表示只有透明度A=8,沒有顏色RGB, 1個像素佔8位=1字節。
ARGB_4444表示A=4,R=4,G=4,B=4, 1個像素佔4+4+4+4=16位=2字節,ARGB_4444的畫質慘不忍睹,所以棄用。
ARGB_8888表示A=8,R=8,G=8,B=8, 1個像素佔8+8+8+8=32位=4字節 。
RGB_565表示沒有透明度A,R=5,G=6,B=5, 1個像素佔5+6+5=16位=2字節。
如果沒有透明度A需求,將ARGB_8888改爲RGB_565可以降低1個像素所佔字節,Bitmap佔用內存也就降低
*/
options.inPreferredConfig = Bitmap.Config.RGB_565;
// 設置取樣大小,假設inSampleSize爲2,則長和寬都變爲原來1/2,Bitmap佔用內存也就降低
options.inSampleSize = 2;
bitmap = BitmapFactory.decode···(···options);

三、矩陣壓縮Bitmap.createBitmap(···matrix···)


// 使用Matrix.setScale(···)讓新Bitmap長寬縮小,新Bitmap佔用內存也就降低
// 方法1
bitmap = Bitmap.createScaledBitmap(bitmap, 160, 160, true); //內部調用了Bitmap.createBitmap(···matrix···)
// 方法2
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

簡書: http://www.jianshu.com/p/72e2161a3714
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/77201735
GitHub博客:http://lioil.win/2016/09/28/Bitmap-Compress.html
Coding博客:http://c.lioil.win/2016/09/28/Bitmap-Compress.html

發佈了156 篇原創文章 · 獲贊 38 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章