Android_Bitmap_圖片的二次取樣並生成縮圖
阿新 • • 發佈:2019-02-10
首先嚐試通過位元組陣列或者流,只去載入圖片的外邊緣,此時必須指定BitmapFactory.Options 的inJustDecodeBounds成員名,將其只為true,一旦設定為true,BitmapFactory解碼後返回值為null,通過Options的outHeight和outWidth可以獲得圖片的寬高。然後根據大小制定合適的縮放比例,通過options.inSampleSize,大大降低載入圖片導致記憶體溢位的風險!
- /**
- * 根據圖片位元組陣列,對圖片可能進行二次取樣,不致於載入過大圖片出現記憶體溢位
- * @param bytes
-
* @return
- */
- publicstatic 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);
- }