BitmapFactory.decodeStream 内存溢出java.lang.OutOfMemoryError

时间:2021-12-29 22:39:31
图片过大(5.78M左右)就可能导致内存溢出java.lang.OutOfMemoryError,通常大家的第一反应是在使用图片之前进行压缩(第一:质量压缩,第二:图片按比例大小压缩,第三:图片按比例大小压缩)但是这个思路是错误的。对质量压缩的理解(仅供参考):不像网上所说的质量压缩既不失真有能压缩,亲测会失真,我觉得任何压缩方法都会付出代价,只是方法合适代价会小,或者牺牲次要方面,来维持我们的目的。下面是bitmap的compress方法官方介绍:BitmapFactory.decodeStream 内存溢出java.lang.OutOfMemoryError网上会对该方法的参数quality曲解  先看官方介绍:@param quality  Hint to the compressor, 0-100. 0 meaning compress for
     *                 small size, 100 meaning compress for max quality. Some
     *                 formats, like PNG which is lossless, will ignore the
     *                 quality setting 
认为100  就是不压缩  ,大小不变,其实是错误的理解    quality只表示compress程度,也就是只要使用compress  就会压缩  ,设置为100  文件也会 变小,当然0表示压缩到最小。经过测试,网上对质量压缩的优化   : Bitmap bitmap = null;          while (true) {              // 这一步是根据要设置的大小,使宽和高都能满足               if ((options.outWidth >> i <= size)                      && (options.outHeight >> i <= size)) {                  // 重新取得流,注意:这里一定要再次加载,不能二次使用之前的流!                   temp = this.getAssets().open(path);                  // 这个参数表示 新生成的图片为原始图片的几分之一。                   options.inSampleSize = (int) Math.pow(2.0D, i);                  // 这里之前设置为了true,所以要改为false,否则就创建不出图片                   options.inJustDecodeBounds = false;                     bitmap = BitmapFactory.decodeStream(temp, null, options);                  break;              }              i += 1;          }          return bitmap;  没有必要,我试了试不起作用,传到服务器会图片变成全黑的情况
重点:正确解决方案
    设置inSampleSize
先说原因吧,BitmapFactory.decodeStream 内存溢出java.lang.OutOfMemoryError 是因为使用Content Provider      android.content.ContentResolver.openInputStream  去取数据时,因为图片过大就会报错,而不是bitmap显示时报错。
所以在使用前压缩的思路是错误了。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);
image1.setImageBitmap(bitmap);
cr:是 android.content.ContentResolver 对象
image1: 是 ImageView对象 网上很多说设Options.inJustDecodeBounds = true;     可 能会出错 ,bitmap 会为null    图片全白 的现象  ,如果你是这种现象,去掉试试。
  关于options.inSampleSize 大小设置  网上有优化这里只做简单处理 ,有大牛做动态计算合适大小。自己没尝试过就不做叙述了。说的不一定对但都是自己亲测的一点感悟,网上很多理解都是错误的,希望可以帮到遇到同样问题的你。