我正在尝试在我的应用中加载大小为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;
}
由于 Ayaz Alavi
答案 0 :(得分:5)
图像文件在加载到内存时未压缩。在5600 x 480像素和每像素32位时,您的图像在未压缩时几乎完全为10 MB。
我的建议是将其剪切成更小的部分,只加载你需要的部分。
答案 1 :(得分:2)
5,600px * 480px * 4字节= 10,752,000字节,所以这并不奇怪。
Displaying Bitmaps Efficiently article中有一些很好的指导,以及有关SO讨论好解决方案的不少问题。
答案 2 :(得分:1)
你期待什么?图像为5600 x 480像素,现在内存每个像素需要32位(plz纠正我的人)。算一算,你就会明白为什么会出问题。您需要使用较小的图像或将图像分割成部分并加载需要的部分并丢弃不必要的部分。
我遇到了类似的问题:Android app crash out of memory on relaunch
此处还有一个关于这个主题和可能的解决方案的长期讨论:Strange out of memory issue while loading an image to a Bitmap object
答案 3 :(得分:0)
如果您加载位图并具有高DPI屏幕分辨率,BitmapFactory将自动缩放您的位图。我认为在具有最大DPI值的设备上,它可以在两个方向上缩放2倍。
这可以解释一些意想不到的增加。尝试将图像放在名为drawable-nodpi
的文件夹中,它们不会缩放。