我正在尝试从包含任意大图像的文件中加载Bitmap
,在其上放置水印(徽标)并将其保存回文件。
我知道在Android上处理大型位图时会出现内存问题。我不想加载较小的图像样本,因为我需要在将其保存回文件时保持相同的质量。
感谢任何帮助。
答案 0 :(得分:5)
发生在解码大图片时使用BitmapFactory.decodeFile(File)导致OutOfMemory问题
OutOfMemoryError
是因为没有足够大的堆空间块来满足您的请求。 Dalvik垃圾收集器是一个非压缩收集器,因此堆将被分割成许多较小的内存块。
如果所有图片的分辨率相同,且minSdkVersion
为11或更高,则在您的流程启动时为其分配Bitmap
(例如,onCreate()
自定义Application
类),并在inBitmap
上与BitmapFactory.Options
一起使用。如果映像可以首先放入堆中,那么分配Bitmap
的尝试应该在堆碎片化之前尽早成功。
如果它们不是全部都是相同的分辨率,但你知道最大分辨率,并且你的minSdkVersion
是19或更高,那么就像我上面描述的那样做。 Android 4.4扩展inBitmap
以支持与您正在加载的图片尺寸相同或更大的Bitmap
,而在此之前必须完全匹配尺寸。
如果不可能:
使用android:largeHeap="true"
在API Level 11+设备上获取更大的堆,或
将图像处理逻辑移至NDK,因为本机内存分配不计入Dalvik堆限制,或
将您的图像处理逻辑移动到专用的短期过程,这样您就可以在需要处理特定图像时获得一个干净的单独堆
后三个选项在应用程序的系统RAM消耗和其他影响方面给用户带来了成本。