图片过大(5.78M左右)就可能导致内存溢出java.lang.OutOfMemoryError,通常大家的第一反应是在使用图片之前进行压缩(第一:质量压缩,第二:图片按比例大小压缩,第三:图片按比例大小压缩)但是这个思路是错误的。对质量压缩的理解(仅供参考):不像网上所说的质量压缩既不失真有能压缩,亲测会失真,我觉得任何压缩方法都会付出代价,只是方法合适代价会小,或者牺牲次要方面,来维持我们的目的。下面是bitmap的compress方法官方介绍:网上会对该方法的参数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 大小设置 网上有优化这里只做简单处理 ,有大牛做动态计算合适大小。自己没尝试过就不做叙述了。说的不一定对但都是自己亲测的一点感悟,网上很多理解都是错误的,希望可以帮到遇到同样问题的你。
。
设置inSampleSize
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options);
image1.setImageBitmap(bitmap);