1.Bitmap概述
Android系統支持幾種圖片(.png (preferred), .jpg (acceptable), .gif (discouraged)), 其中Bitmap位圖#ffffffff,包括圖片透明度Alpha和RGB,圖片質量很好,每一個像素位占4個字節,如果圖片很大將會占據很大的內存空間。存儲在SDCard的image很小,加載進內存可能就會很大。因此,對bitmap圖像進行操作,應該特別小心,可能出現內存溢出問題。為此對於大圖片,應該引入該圖片的二次采樣生成縮略圖。
2.Bitmap縮略圖
首先嘗試通過字節數組或者流,只去加載圖片的外邊緣,此時必須指定BitmapFactory.Options 的inJustDecodeBounds成員名,將其只為true,一旦設置為true,BitmapFactory解碼后返回值為null,通過Options的outHeight和outWidth可以獲得圖片的寬高。然后根據大小制定合適的縮放比例,通過options.inSampleSize,大大降低加載圖片導致內存溢出的風險!
- /**
- * 根據圖片字節數組,對圖片可能進行二次采樣,不致於加載過大圖片出現內存溢出
- * @param bytes
- * @return
- */
- public static Bitmap getBitmapByBytes(byte[] bytes){
- //對於圖片的二次采樣,主要得到圖片的寬與高
- int width = 0;
- int height = 0;
- int sampleSize = 1; //默認縮放為1
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true; //僅僅解碼邊緣區域
- //如果指定了inJustDecodeBounds,decodeByteArray將返回為空
- BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
- //得到寬與高
- height = options.outHeight;
- width = options.outWidth;
- //圖片實際的寬與高,根據默認最大大小值,得到圖片實際的縮放比例
- while ((height / sampleSize > Cache.IMAGE_MAX_HEIGHT)
- || (width / sampleSize > Cache.IMAGE_MAX_WIDTH)) {
- sampleSize *= 2;
- }
- //不再只加載圖片實際邊緣
- options.inJustDecodeBounds = false;
- //並且制定縮放比例
- options.inSampleSize = sampleSize;
- return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
- }