在Android中,如何显示SD卡中的图像(任意大小的),而不会出现内存不足错误的情况?

是否需要先将图像放入媒体商店?

伪代码示例将不胜感激。 如果显示的图像与设备的内存水平允许一样大,则加分。

最佳答案

编辑:实际上,这个问题已经在Strange out of memory issue while loading an image to a Bitmap object(投票率最高的两个答案)中得到了回答。它也确实使用inSampleSize选项,但是使用一个小的方法来自动获取适当的值。

我的原始答案:
inSampleSize类的BitmapFactory.Options可以解决您的问题(http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize)。它通过制作一个位图来实现,该位图的宽度和高度比原始宽度高1/inSampleSize,从而减少了内存消耗(通过inSampleSize ^ 2?)。您应该先阅读该文档,然后再使用它。

例子:

BitmapFactory.Options options = new BitmapFactory.Options();
// will results in a much smaller image than the original
options.inSampleSize = 8;

// don't ever use a path to /sdcard like this, but I'm sure you have a sane way to do that
// in this case nebulae.jpg is a 19MB 8000x3874px image
final Bitmap b = BitmapFactory.decodeFile("/sdcard/nebulae.jpg", options);

final ImageView iv = (ImageView)findViewById(R.id.image_id);
iv.setImageBitmap(b);
Log.d("ExampleImage", "decoded bitmap dimensions:" + b.getWidth() + "x" + b.getHeight()); // 1000x485

但是,在这里,它仅适用于inSampleSize ^ 2倍于所允许的内存大小的图像,并且会降低小图像的质量。
诀窍是找到合适的inSampleSize。

09-26 12:37