在Android中显示来自SD卡的大图

在Android中,您如何从SD卡上显示任意大小的图像, 而不会出现内存不足的错误

是否有必要把图像放在媒体商店?

一个伪代码的例子将不胜感激。 如果显示的图像与设备的内存级别一样大,则需要加分

Solutions Collecting From Web of "在Android中显示来自SD卡的大图"

编辑:这个问题实际上已经回答了奇怪的内存不足的问题,同时加载到一个Bitmap对象的图像 (两个最高的投票答案)。 它也使用inSampleSize选项,但使用一个小方法来自动获取适当的值。

我原来的答案是:

BitmapFactory.Options类的inSampleSize可以解决您的问题( http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize )。 它的工作原理是通过生成宽度和高度为1 / inSampleSize的位图,从而减less内存消耗(通过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倍,并且会降低小图像的质量。 诀窍是find合适的inSampleSize。

我使用代码显示任何大小的图像:

 ImageView imageView=new ImageView(this); imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imageView.setAdjustViewBounds(true); FileInputStream fis=new FileInputStream(file); BitmapFactory.Options options=new BitmapFactory.Options(); options.inSampleSize=2; //try to decrease decoded image options.inPurgeable=true; //if necessary purge pixels into disk options.inScaled=true; //scale down image to actual device density Bitmap bm=BitmapFactory.decodeStream(is, null, options); imageView.setImageBitmap(bm); fis.close(); 

例如:

 yourImgView.setImageBitmap(BitmapFactory.decodeFile("/sdcard/1.jpg")); 

http://www.developer.com/ws/other/article.php/3748281/Working-with-Images-in-Googles-Android.htm涵盖了所有你需要知道的图像主题,包括获取他们从SD卡。 你会注意到在那里的代码,复制如下:

 try { FileOutputStream fos = super.openFileOutput("output.jpg", MODE_WORLD_READABLE); mBitmap.compress(CompressFormat.JPEG, 75, fos); fos.flush(); fos.close(); } catch (Exception e) { Log.e("MyLog", e.toString()); }