【发布时间】:2013-08-24 15:54:50
【问题描述】:
下面的代码会导致 OutOfMemory 吗?我认为它允许超过应用程序内存限制。
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true);
在 Android 中旋转图像的最佳方式是什么?
在新进程的服务中分配它以获得更多堆?
@CommonsWare 在此链接 [1] 中表示,许多开发人员认为更多的堆是低效编码的解决方案。
这个问题也表示大堆[2]。
有没有更简单的解决方案?
【问题讨论】:
-
处理图像一直是一项有风险的业务,我的游戏应用也遇到过问题,如果你还没有,你可能想看看这个,已经developer.android.com/training/displaying-bitmaps/…
-
对于 3.x 及更高版本的设备,只需采取合理措施,不要保留大量不需要的位图。在 2.x 设备上没有简单的解决方案 - 您必须非常严格地管理您的位图引用和回收。
-
如果要旋转源自 yuv 格式的图像(例如相机预览或视频帧解码),将节省内存。如果您的来源是 Jpeg(例如来自相机的 takePicture),则可以更快地旋转它。如果您也需要 Jpeg 进行输出,则可以使旋转无损。
-
在这个位置:" ... Bitmap.createBitmap(..)" 你将同时拥有两个位图图像。原始和新的,所以如果你想保持新图像的质量,我认为最好的解决方案是在清单文件的应用程序标记中添加“android:largeHeap="true""。其他解决方案是使用一些 NDK 库,如果您想保持质量,这些库可能会或可能不会帮助您。
标签: android image-processing bitmap heap-memory