在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。