我正在编写一个相机应用程序,当我拍照时,我收到一个字节 [],将其解码为位图并在将其保存为 JPEG 之前对其进行旋转。我正在使用 native 库旋转照片,但是位图仍然从 byte[] 解码到内存中(仍然允许我保留 1 个位图而不是 2 个)。所以基本上在我的代码中有 1 个地方我需要大量内存和 OOM 在一些堆低且相机是愚蠢的百万像素的设备上。关于如何在不降低图像质量的情况下解决这个问题有什么建议吗?
我不认为我想使用largeHeap="true"
我应该忘记旋转而只设置 EXIF 吗?
此外,我不太热衷于尝试“预测”我是否会 OOM,因为数学没有加起来:Android OutOfMemory when GC reports free memory?
最佳答案
Any suggestions how to fix this without on loosing image quality?
使用 android:largeHeap="true"
。
或者,使用其他一些允许您交出 byte[]
并为您旋转并保存到磁盘的 native 库,以避免 Bitmap
和对大型事物的任何 Java 级处理。
或者,如果您的 minSdkVersion
是 19,并且您的其余逻辑支持它,请在 BitmapFactory.Options
上使用 inBitmap
来尝试重用一个已经分配的 Bitmap
对象而不是分配一个新的对象。此选项在早期版本的 Android 上可用,但对于那些它必须在分辨率方面完全匹配;对于 19 岁以上的用户,要重用的 Bitmap
必须足够大以处理您要加载到其中的内容。
I don't think I want to use largeHeap="true"
这可能无济于事(并非所有设备都会为您提供更大的堆),并且用户需要为更大的堆限制付出代价。话虽如此,如果没有更多内存,无论是在 Java 堆中还是代表操作系统从 native 代码分配的内存,都很难操纵大型相机图像。
Should I forget about rotation and just set EXIF?
这当然是另一种可能性,虽然各种东西,比如 ImageView
,似乎忽略了 EXIF header 。
I'm not so keen on trying to 'predict' if I will OOM as the math's not adding up
部分原因是 Dalvik 没有压缩/移动 GC,而 ART 只有一个,而您的应用程序不在前台。 OutOfMemoryError
表示您尝试分配的内容没有单个连续的空闲内存块。
关于Android 位图处理 - 没有泄漏但仍然 OOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260420/