【问题标题】:Load large picture from file and add watermark从文件加载大图片并添加水印
【发布时间】:2014-05-30 10:55:43
【问题描述】:

我正在尝试找到一种有效的方法来从包含任意大图像的文件中加载Bitmap,在其上放置水印(徽标),然后将其保存回文件。

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

感谢任何帮助。

【问题讨论】:

  • 帮助什么?你的问题是什么?如果问题是“我该怎么做”,您具体尝试了什么,遇到了哪些具体问题?
  • 在解码大图片时使用 BitmapFactory.decodeFile(File) 会导致 OutOfMemory 问题。我只能加载需要放置水印的位图部分,但是如何将那部分保存在文件中?
  • chat.stackoverflow.com/rooms/50427/android-help entra che ti passo una logica :)

标签: android memory bitmap


【解决方案1】:

使用 BitmapFactory.decodeFile(File) 解码大图时会导致 OutOfMemory 问题

OutOfMemoryError 发生是因为没有足够大的堆空间块来满足您的请求。 Dalvik 垃圾收集器是一个非压缩收集器,因此堆会被分割成许多更小的内存块。

如果所有图片的分辨率相同,并且您的minSdkVersion 为 11 或更高,则在您的进程启动时为其分配Bitmap(例如,在自定义ApplicationonCreate() 中类),并在您的BitmapFactory.Options 上使用inBitmap。如果图像一开始就可以放入堆中,那么您分配 Bitmap 的尝试应该会在堆碎片化之前尽早成功。

如果它们的分辨率不同,但您知道最大分辨率,并且您的minSdkVersion 为 19 或更高,则执行与我上述相同的操作。 Android 4.4 扩展了inBitmap 以支持与您正在加载的图像大小相同或更大的Bitmap,而之前它必须完全匹配大小。

如果这些都不可能:

  • 使用android:largeHeap="true" 在 API 级别 11+ 设备上获得更大的堆,或

  • 将图像处理逻辑移至 NDK,因为本机内存分配不计入 Dalvik 堆限制,或者

  • 将您的图像处理逻辑移至专用的短期进程,以便在需要处理特定图像时获得一个干净的独立堆

就应用的系统 RAM 消耗和其他影响而言,后三个选项会给用户带来成本。

【讨论】:

  • 我在哪里可以阅读更多关于“专用短期进程”的信息?如果我们不告诉他就这样做,用户就会付出代价,否则他愿意等待。也许吧。
  • @rupinderjeet:我指的是在某些组件(例如<service>)上使用android:process 将其移动到一个单独的进程,该组件在其中完成大量工作然后完成(例如, `stopSelf()).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多