如何防止因将大图像放在图像视图上而导致的“内存不足”崩溃



我将用户从图库中选择的图像放在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崩溃。

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

谢谢!

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

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

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

此外,您还应该查看inSampleSize。

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

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

最新更新