bitmap 二次采样

来源:互联网 发布:用友u8数据库修复工具 编辑:程序博客网 时间:2024/06/10 10:51
  1. 首先尝试通过字节数组或者流,只去加载图片的外边缘,此时必须指定BitmapFactory.Options 的inJustDecodeBounds成员名,将其只为true,一旦设置为true,BitmapFactory解码后返回值为null,通过Options的outHeight和outWidth可以获得图片的宽高。然后根据大小制定合适的缩放比例,通过options.inSampleSize,大大降低加载图片导致内存溢出的风险!

  2. /** 
  3.  * 根据图片字节数组,对图片可能进行二次采样,不致于加载过大图片出现内存溢出 
  4.  * @param bytes 
  5.  * @return 
  6.  */  
  7. public static Bitmap getBitmapByBytes(byte[] bytes){  
  8.       
  9.     //对于图片的二次采样,主要得到图片的宽与高  
  10.     int width = 0;  
  11.     int height = 0;  
  12.     int sampleSize = 1//默认缩放为1  
  13.     BitmapFactory.Options options = new BitmapFactory.Options();  
  14.     options.inJustDecodeBounds = true;  //仅仅解码边缘区域  
  15.     //如果指定了inJustDecodeBounds,decodeByteArray将返回为空  
  16.     BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);  
  17.     //得到宽与高  
  18.     height = options.outHeight;  
  19.     width = options.outWidth;  
  20.   
  21.     //图片实际的宽与高,根据默认最大大小值,得到图片实际的缩放比例  
  22.     while ((height / sampleSize > Cache.IMAGE_MAX_HEIGHT)  
  23.             || (width / sampleSize > Cache.IMAGE_MAX_WIDTH)) {  
  24.         sampleSize *= 2;  
  25.     }  
  26.   
  27.     //不再只加载图片实际边缘  
  28.     options.inJustDecodeBounds = false;  
  29.     //并且制定缩放比例  
  30.     options.inSampleSize = sampleSize;  
  31.     return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);  
  32. }  
0 0