如何防止在ImageView上放置大图像导致的“OutOfMemory”崩溃

时间:2013-09-21 21:18:06

标签: android bitmap crash imageview out-of-memory

我将用户从图库中选择的图片放在ImageView

问题是有时候这些照片会非常大。

离。 ,3648 X 2736

我有一种方法,在检查图像是否大于2048 X 2048后,它通过改变高度来调整大小,但它不起作用。 (它仍然粉碎):

电话:

if(mPhoto.getHeight()>=2048||mPhoto.getWidth()>=2048){

   image.setImageBitmap(scaleDownBitmap(mPhoto,200));

方法本身:

public  Bitmap scaleDownBitmap(Bitmap photo, int newHeight) {

        final float densityMultiplier = getResources().getDisplayMetrics().density;

        int h= (int) (newHeight*densityMultiplier);
        int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));

        photo=Bitmap.createScaledBitmap(photo, w, h, true);

        return photo;
        }

我甚至不认为该方法会运行...只要从文件中提取图像,就会发生OutOfMemory崩溃。

我该怎么办?

即使在我用try{}catch{} ..

设置图像的行周围,它也会崩溃

图片不是drawable文件夹中的资源。它来自相机,画廊或互联网。

我知道我可能接近内存限制,请不要回答明显的问题。问题是如何解决它。

某些大型图像可以在某些设备上运行(具有大量内存的新设备)

对于Ex。同样的图像适用于星系s4但会使星系s1崩溃。

我找不到任何解决方案......

非常感谢!

5 个答案:

答案 0 :(得分:1)

你应该回收旧的照片实例。变化

 photo=Bitmap.createScaledBitmap(photo, w, h, true);

  Bitmap toReturn = Bitmap.createScaledBitmap(photo, w, h, true); 
  photo.recycle();

  return toReturn;

另外你应该看看inSampleSize

答案 1 :(得分:1)

使用BitmapFactory参数探索BitmapFactory.Options方法,这有助于您正确有效地缩放图像,有效避免内存不足。

答案 2 :(得分:1)

答案 3 :(得分:0)

是的,Bitmap.createScaledBitmap为您创建了新实例,并且肯定会占用大量内存。您可以尝试使用photo.recycle()来销毁旧实例,但有时即使您谈论“大”图片也无济于事。

答案 4 :(得分:0)

您可以访问Android开发者网站并查看此Loading Large Bitmaps Efficiently。 Android开发人员提供了有关如何加载大型位图的示例项目。

相关问题