Android使用BitmapFactory.Options解决加载大图片内存溢出问题

http://orgcent.com/android-outofmemoryerror-load-big-image/

由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存溢出(java.lang.OutOfMemoryError),只有在BitmapFactory加载图片时使用BitmapFactory.Options对相关参数进行配置来减少加载的像素。

1、设置缩放大小对图片作处理

public Bitmap getBitmapFromFile(File dst, int width, int height) {     if (null != dst && dst.exists()) {         BitmapFactory.Options opts = null;         if (width > 0 && height > 0) {             opts = new BitmapFactory.Options();             opts.inJustDecodeBounds = true;             BitmapFactory.decodeFile(dst.getPath(), opts);             // 计算图片缩放比例             final int minSideLength = Math.min(width, height);             opts.inSampleSize = computeSampleSize(opts, minSideLength,                     width * height);             opts.inJustDecodeBounds = false;             opts.inInputShareable = true;             opts.inPurgeable = true;         }         try {             return BitmapFactory.decodeFile(dst.getPath(), opts);         } catch (OutOfMemoryError e) {             e.printStackTrace();         }     }     return null; }

public static int computeSampleSize(BitmapFactory.Options options,         int minSideLength, int maxNumOfPixels) {     int initialSize = computeInitialSampleSize(options, minSideLength,             maxNumOfPixels);     int roundedSize;     if (initialSize <= 8) {         roundedSize = 1;         while (roundedSize < initialSize) {             roundedSize <<= 1;         }     } else {         roundedSize = (initialSize + 7) / 8 * 8;     }     return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options,         int minSideLength, int maxNumOfPixels) {     double w = options.outWidth;     double h = options.outHeight;     int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math             .sqrt(w * h / maxNumOfPixels));     int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math             .floor(w / minSideLength), Math.floor(h / minSideLength));     if (upperBound < lowerBound) {         // return the larger one when there is no overlapping zone.         return lowerBound;     }     if ((maxNumOfPixels == -1) && (minSideLength == -1)) {         return 1;     } else if (minSideLength == -1) {         return lowerBound;     } else {         return upperBound;     } }


更多相关文章

  1. Android(安卓)的属性系统
  2. android的selector背景选择器
  3. Android中几种图像特效处理
  4. Android进程注入
  5. android热修复技术 HotFix
  6. Android应用程序资源——Drawable资源概述
  7. 浅谈android的selector背景选择器
  8. 演化理解 Android(安卓)异步加载图片
  9. afinal快速开发框架

随机推荐

  1. 【Android(安卓)初学】2、View初步
  2. Android(安卓)之 ContentProvider 共享数
  3. 使用 kotlin 开发 android 遇到的问题
  4. Android消息通知
  5. 为 Android(安卓)添加 Java 层服务(三)
  6. 解决方法:Eclipse的 window-->preferences
  7. Android引用百度定位API第三方组件后导致
  8. Android(安卓)桌面组件
  9. Android(安卓)复制文本
  10. Android(安卓)Studio开发环境搭建手记