[英]How to compress bitmap from 10mb image from camera to 300kb beforw setting to imageview in android
[英]android 495KB image taking 10MB of Heap size
我正在尝试在尺寸为495KB的应用程序中加载图像。 如果我加载此映像,则堆大小从25MB增加到35MB,这会导致我的应用程序出现实际内存问题。 如果我不加载此图像比堆大小保持在25MB。 谁能说出为什么要占用这么多堆大小?
图片如下
我用来加载图像的代码是
InputStream s4 = getResources().openRawResource(R.drawable.parallax_layer4);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
System.gc();
if(bitmap4 != null) {
bitmap4.recycle();
}
s3 = null;
System.gc();
bitmap4 = bitmap(s4);
layer4Back = new ImageView(this);
layer4Back.setImageBitmap(bitmap4);
layer4Back.setScaleType(ScaleType.FIT_XY);
parallaxLayout.addView(layer4Back, 3, lp);
try {
s4.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
s4 = null;
System.gc();
private static Bitmap bitmap(final InputStream is) {
Bitmap bitmap = null;
System.gc();
Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inSampleSize = 1;
try {
// bitmap = BitmapFactory.decodeStream(is);
bitmap = BitmapFactory.decodeStream(is, null, options);
} catch (Error e) {
// TODO: handle exception
e.printStackTrace();
}
return bitmap;
}
谢谢阿亚兹·阿拉维
图像文件加载到内存后将被解压缩。 在5600 x 480像素和每像素32位的情况下,未压缩的图像几乎可以精确到10 MB。
我的建议是将其切成较小的部分,然后仅加载您需要的部分。
5,600px * 480px * 4字节= 10,752,000字节,因此这不足为奇。
在“ 有效显示位图”一文中有一些很好的指导,以及关于SO讨论好的解决方案的许多问题。
那么您期望什么? 图像是5600 x 480像素,现在内存中的每个像素都需要32位(请给我指正)。 算一下,您就会知道为什么会出现问题。 您需要使用较小的图像,或者将图像切成一部分,并在需要时加载所需的部分,并丢弃不必要的部分。
我有一个类似的问题在这里讨论: 重新启动时,Android应用程序崩溃导致内存不足
这里也有关于主题和可能解决方案的长时间讨论: 将图像加载到Bitmap对象时出现内存不足问题
如果加载位图并且具有高DPI屏幕分辨率,则BitmapFactory将自动缩放位图。 我认为,在具有最大DPI值的设备上,它在两个方向上都会缩放2倍。
这可以解释一些意外的增加。 尝试将图像放在名为drawable-nodpi
文件夹drawable-nodpi
,它们将不会缩放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.