gpt4 book ai didi

Android 位图处理 - 没有泄漏但仍然 OOM?

转载 作者:行者123 更新时间:2023-11-29 20:46:28 25 4
gpt4 key购买 nike

我正在编写一个相机应用程序,当我拍照时,我收到一个字节 [],将其解码为位图并在将其保存为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com