1. 程式人生 > >Android_Bitmap_圖片的二次取樣並生成縮圖

Android_Bitmap_圖片的二次取樣並生成縮圖

首先嚐試通過位元組陣列或者流,只去載入圖片的外邊緣,此時必須指定BitmapFactory.Options 的inJustDecodeBounds成員名,將其只為true,一旦設定為true,BitmapFactory解碼後返回值為null,通過Options的outHeight和outWidth可以獲得圖片的寬高。然後根據大小制定合適的縮放比例,通過options.inSampleSize,大大降低載入圖片導致記憶體溢位的風險!

  1. /**  
  2.  * 根據圖片位元組陣列,對圖片可能進行二次取樣,不致於載入過大圖片出現記憶體溢位  
  3.  * @param bytes  
  4.  * @return  
  5.  */
  6. publicstatic Bitmap getBitmapByBytes(byte[] bytes){    
  7.     //對於圖片的二次取樣,主要得到圖片的寬與高  
  8.     int width = 0;    
  9.     int height = 0;    
  10.     int sampleSize = 1//預設縮放為1  
  11.     BitmapFactory.Options options = new BitmapFactory.Options();    
  12.     options.inJustDecodeBounds = true;  //僅僅解碼邊緣區域  
  13.     //如果指定了inJustDecodeBounds,decodeByteArray將返回為空  
  14.     BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);    
  15.     //得到寬與高  
  16.     height = options.outHeight;    
  17.     width = options.outWidth;    
  18.     //圖片實際的寬與高,根據預設最大大小值,得到圖片實際的縮放比例  
  19.     while ((height / sampleSize > Cache.IMAGE_MAX_HEIGHT)    
  20.             || (width / sampleSize > Cache.IMAGE_MAX_WIDTH)) {    
  21.         sampleSize *= 2;    
  22.     }    
  23.     //不再只加載圖片實際邊緣  
  24.     options.inJustDecodeBounds = false;    
  25.     //並且制定縮放比例  
  26.     options.inSampleSize = sampleSize;    
  27.     return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);    
  28. }