从文件加载大图片并添加水印

时间:2014-05-30 10:55:43

标签: android memory bitmap

我正在尝试从包含任意大图像的文件中加载Bitmap,在其上放置水印(徽标)并将其保存回文件。

我知道在Android上处理大型位图时会出现内存问题。我不想加载较小的图像样本,因为我需要在将其保存回文件时保持相同的质量。

感谢任何帮助。

1 个答案:

答案 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消耗和其他影响方面给用户带来了成本。