解决方案 »

  1.   

    图片的大小都超出vm heapsize了啊,能不OOM嘛
      

  2.   

    http://blog.csdn.net/wwj_748/article/details/10079311
    我处理图片都是使用的ImageLoader 你可以看下这个博客 有介绍!对于大图片几M的图片 也没有发现问题
      

  3.   

    /**
     * 从uri 中读取图片并进行压缩处理
     * 
     * @param uri
     * @param scaleSize  目标大小
     * @return
     */
    public static Bitmap byteScaleToBitmap(Uri uri, int scaleSize) { Bitmap bm = null; BitmapFactory.Options options = new BitmapFactory.Options();
    // 这个参数定义返回 bm为null 仅仅计算图片宽高 而不实际生成图片
    options.inJustDecodeBounds = true;
    InputStream is;
    try {
    is = mContext.getContentResolver().openInputStream(uri);
    bm = BitmapFactory.decodeStream(is, null, options);
    int width = options.outWidth;
    int height = options.outHeight;
     
    // 压缩比例
    int be = 1;
    if (width > scaleSize || height > scaleSize) { if (width > height) {
    be = width / scaleSize + 1;
    } else {
    be = height / scaleSize + 1;
    }
    }
    // 设置为false 实际生产图片
    options.inJustDecodeBounds = false;
    if (be > 1) {// 如果大于1 就设置压缩参数
    // 执行压缩
    options.inSampleSize = be; // sampleSize 可接受任意值 当时小于或者等于这个值的2次方数才会生效
    }
    is.close();
    is = mContext.getContentResolver().openInputStream(uri); //实际读取图片
    bm = BitmapFactory.decodeStream(is, null, options);
    is.close();   } catch (FileNotFoundException e) {
     
    e.printStackTrace(); } catch (IOException e) {
     
    e.printStackTrace();
    }
    return bm; }提示 
    1 以上代码 处理从文件中读取大图片的做法, 首先获取图片大小, 设置合理的压缩比率 然后才实际读取图片内容
      这样不至于一下子将一个2048×2048 之类的图片读取进内存而导致oom。
      仅适用查看全图
    2 对于通过滑动查看超大图片图片情况 ,
      个人思路 对大图片进行按屏幕大小等分切割,然后存在sd卡上,然后根据点击位置读取相邻的4个图片(最多4个),然后进行渲染。