安卓 - 对位图进行选择性对焦

5

目前我可以通过缩小再放大整个位图来模糊它。

我的目标是达到有选择性的模糊效果:结果位图被模糊,但其中一个圆形/椭圆形部分仍然清晰:

Example image

难点在于,清晰的椭圆形部分可能更小或更大,并且应该是可移动的(其坐标并不总是原始位图的中心)。

我已经找到了一种解决方案,但我认为在性能上不太好:

  1. 将原始位图复制到两个不同的位图中(背景和前景)
  2. 对背景进行模糊处理
  3. 将前景裁剪成所需的形状(圆形或椭圆形)
  4. 轻微擦除前景边框(以避免前景和背景图像之间的过度锐利差异)
  5. 将两个图像放回到一起
  6. 导出为位图

Possible solution image

另一种解决方案可能是重新创建一个模糊算法,它会遍历原始位图的每个像素,并根据位图的部分应用更高或更低的模糊度。


1
另一个解决方案可能是重新创建一个模糊算法,该算法将通过每个像素运行 - 这将需要数百万年才能完成。在我看来,您当前的解决方案似乎是最好的。快速模糊技术:http://trickyandroid.com/advanced-blurring-techniques/ - Phantômaxx
1
你的观点与我相同:即使修改现有算法,例如http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html,性能也不会很好。 - Quentin S.
1
快速模糊技术:http://trickyandroid.com/advanced-blurring-techniques/ 关于PorterDuff的有趣事情(用于切割孔):http://ssp.impulsetrain.com/porterduff.html - Phantômaxx
@DerGolem:感谢您提供的这些链接!使用RenderScript将增强模糊效果。关于PorterDuff:我可以使用PNG蒙版来创建位图(我的绘图中的第四个阶段)。我能拉伸位图而不改变其alpha通道吗? - Quentin S.
1个回答

3

我最终决定采用@DerGolem的链接,按照以下更新过的图表:

Updated chart

算法非常简单:

  1. 我们创建了两份位图:第一份将用作背景,而第二份将用作图片的清晰部分。为了避免第二张图片过于清晰,我们将使用一个准备好的掩码(存储在可绘制文件夹中)。
  2. 我们根据需要对第一份进行模糊处理
  3. 我们将掩码应用到第二个位图上
  4. 我们从前两步创建一个位图

我创建了一个样本演示应用程序,托管在BitBucket上。您可以克隆项目并尝试它,性能比我预期的要好得多!

为了实现这一点,我使用了以下资源:

  1. RenderScript用于模糊背景,比缩放图像更好:12
  2. 了解Porter/Duff

正如项目的自述文件中所说,提供的代码还远远不完美,但它可以工作。


谢谢您,我在互联网上寻找如何实现选择性焦点,除了这个答案之外,我什么都找不到。 - Moh Mah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接