【问题标题】:How to prevent `OutOfMemory` crashing caused by putting large images on an ImageView如何防止将大图像放在 ImageView 上导致的“OutOfMemory”崩溃
【发布时间】:2013-09-21 21:18:05
【问题描述】:

我将用户从图库中选择的图像放入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{}..包围设置图像的行,它也会崩溃。

图像不是可绘制文件夹中的资源。它来自相机、画廊或互联网。

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

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

例如。相同的图像适用于 Galaxy s4,但会使 Galaxy s1 崩溃。

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

非常感谢!

【问题讨论】:

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


【解决方案1】:

您应该回收照片的旧实例。改变

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

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

  return toReturn;

你也应该看看inSampleSize

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2018-10-21
        • 2012-09-25
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        相关资源
        最近更新 更多