Android_Bitmap_圖片的二次采樣並生成縮略圖


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,大大降低加載圖片導致內存溢出的風險!

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM