Android:快速位图模糊?
convolution
image-processing
6
0

在过去的三天里,我一直在寻找一种内置的,硬件加速的方法来模糊android的位图。我偶然发现了某些变通方法,例如缩小位图并再次将其放大,但是这种方法产生的质量较低,不适合我的图像识别要求。我还读到,使用着色器或JNI实现卷积是一个不错的方法,但是我不敢相信Android框架中没有内置解决方案可以实现这一非常普遍的目的。目前,我最终用Java编写了一个自写卷积实现,但是它很慢。我的问题是:

  • Android框架中真的没有内置解决方案吗?
  • 如果没有解决方案,那么在实现和维护方面仍然相当合理的情况下,加速卷积的最有效方法是什么?我们应该使用JNI,着色器还是其他完全不同的东西?
参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

我终于找到了合适的解决方案:

  • RenderScript允许实施繁重的计算,这些计算透明地扩展到执行设备上可用的所有内核。我得出的结论是,就性能和实现复杂性的合理平衡而言,这是比JNI或着色器更好的方法。
  • 从API级别17开始,API提供了ScriptIntrinsicBlur类。这正是我一直在寻找的东西,即高级的,硬件加速的高斯模糊实现。
  • ScriptIntrinsicBlur现在是支持Froyo及更高版本(API> 8)的android支持库(v8)的一部分。 支持的RenderScript库上的android开发者博客文章提供了一些有关如何使用它的基本提示。

但是,关于ScriptIntrinsicBlur类的文档非常少,我花了更多时间来找出正确的调用参数。为了使名为photo的普通ARGB_8888型位图ARGB_8888 ,它们是:

final RenderScript rs = RenderScript.create( myAndroidContext );
final Allocation input = Allocation.createFromBitmap( rs, photo, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT );
final Allocation output = Allocation.createTyped( rs, input.getType() );
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create( rs, Element.U8_4( rs ) );
script.setRadius( myBlurRadius /* e.g. 3.f */ );
script.setInput( input );
script.forEach( output );
output.copyTo( photo );
收藏
评论

可能最苛刻的要求是实时模糊,这意味着您可以随着视图的变化实时模糊。在这种情况下,模糊效果所花费的时间不应超过10毫秒左右(以便在16ms / 60fps的画面上有一些游戏空间),以使其看起来平滑。即使在不太高端的设备(银河s3甚至更慢)上,也可以通过正确的设置来实现此效果。

以下是如何提高性能的重要性:

  1. 使用缩小的图像:这会减少像素以使其模糊。当您想要真实的模糊图像时,它也为您工作。图像加载和内存消耗也大大降低了。

  2. 使用Renderscript ScriptIntrinsicBlur-截至2014年,Android中可能没有更好/更快的解决方案。我经常看到的一个错误是Renderscript上下文没有被重用,而是在每次使用模糊算法时创建的。提醒您RenderScript.create(this); Nexus 5大约需要20毫秒的时间,因此您要避免这种情况。

  3. 重用位图:不要创建不必要的实例,而总是使用相同的实例。当您需要真正快速的模糊处理时,垃圾收集起着主要作用(在收集某些位图时需要花费10到20毫秒的时间)。还可以仅裁剪和模糊所需的内容。

  4. 对于实时模糊,可能是由于上下文切换所致,不可能在另一个线程(甚至使用线程池)中进行模糊处理,只有主线程足够快才能及时更新视图,而我看到的线程滞后时间为100-300ms

有关更多提示,请参阅我的其他文章:https://stackoverflow.com/a/23119957/774398

顺便说一句我在这个应用程序中做了一个简单的实时模糊处理: githubPlaystore

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号