如何解决在Android中缩放图像会导致OutOfMemory异常
| 我正在开发一个包含许多图片作为精灵的Android游戏。 当我以下列方式加载图像时:public static Bitmap loadBitmap(int resId) {
return BitmapFactory.decodeResource(getResources(),resId,options);
}
一切正常。
当我尝试使用以下代码缩小或放大位图时:
public static Bitmap loadBitmap(int resId) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),options);
Matrix matrix = new Matrix();
matrix.postScale(0.8f,0.8f);
Bitmap scaledBitmap = Bitmap.createBitmap(bitmap,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
bitmap.recycle();
bitmap = null;
return scaledBitmap;
}
该应用程序崩溃,但出现以下异常:
2211840-byte external allocation too large for this process.
Out of memory: Heap Size=4935KB,Allocated=2549KB,Bitmap Size=18463KB
VM won\'t let us allocate 2211840 bytes
为什么缩放导致OutOfMemory异常?我什至尝试回收原始图像以节省空间。我不是故意使用Bitmap.createScaledBitmap(...)
,因为此方法确实会在内部发生内存泄漏(如其他在线资源中所述)。
先感谢您,
兹拉特科
解决方法
您可能非常接近内存限制。看起来您正在创建一个很大的位图(并且我不确定为什么要使其尺寸与原始位图相同)。从日志中,您已经使用了25MB的Java分配和18MB的位图分配,因此基本上可以满足48MB的堆限制。
我也认为createScaledBitmap()泄漏的可能性很小。它所做的基本上就是您在这里所做的。
, 您应尝试在BitmapFactory.Options类中使用变量\“ inSampleSized \”。这将在不使用过多内存的情况下扩展。
http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize
, 我猜你真的很接近堆限制。在您的函数中,您基本上是在实例化第二个位图,这大致导致内存加倍(位图非常大)。如果您使用的操作系统早于Honeycomb,那么查看存储在某处的内存值也会产生误导。 iirc,位图直接保存在系统内存堆中,而其他所有内容都保存在vm堆中(这些是您看到的值-> 2,5MB)。但是,用于位图分配的内存也计入内存堆限制。 :/
建议您看一下此Google I / O会话:http://www.youtube.com/watch?v=_CruQY55HOk
我认为您的问题只能通过降低位图的分辨率或使用某种缩放功能来解决,该功能不会实例化新的位图并修改现有的位图(如AmandeepGrewal提到的那样)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。