【问题标题】:How to blur a Bitmap (Android)?如何模糊位图(Android)?
【发布时间】:2010-09-09 06:35:06
【问题描述】:

我正在努力使用 Android 模糊位图。

我看过很多关于使用简单内核的信息,比如

0    0    0    5    0    0    0
0    5   18   32   18    5    0
0   18   64  100   64   18    0
5   32  100  100  100   32    5
0   18   64  100   64   18    0
0    5   18   32   18    5    0
0    0    0    5    0    0    0

我的问题是我真的不确定如何以有效的方式将它与我的位图相乘。

我应该遍历每个像素吗?

image.getPixel(x, y)

同时将这些值存储到一个新数组中(这样我就不必一遍又一遍地获取这些值),然后遍历数组并为每个值加上周围的值乘以内核中的相应字段除以 1068(在上述内核的情况下(= 所有条目的总和))?

有没有更好的方法来做到这一点?有没有简单的边界解决方案?

或者我错过的 Android SDK 中是否有可用的东西?

【问题讨论】:

标签: android bitmap blur


【解决方案1】:

您所做的基本上是原始图像 I 和内核 K 之间的 2D 卷积(内核实际上是 PSF - 点扩散函数)。如果您的图像 I 的大小为 m x n,而内核的大小为 r x s,则对于模糊图像 J 的每个点,您需要 r x s 乘法,从而导致整个图像的总乘法为 m x n x r x s。

计算上更有效的方法是使用 DFT(离散傅里叶变换)。对图像和内核进行变换,并在变换域中将它们相乘,然后通过逆 DFT 恢复。简而言之:

J = IDFT(DFT(I)*DFT(K))

对于 DFT 计算,存在快速算法(FFT - 快速傅里叶变换)。您可以在 Internet 上的 C 源代码中找到它们。为了使用C源代码,您需要使用Android平台支持的JNI(Java Native Interface)。

关于边界,使用 DFT 时没有问题,因为边界处的模糊是循环完成的(例如,左边界值也使用一些右边界值计算)。

如果您正在使用可能被分离的内核(二维内核表示为一维内核的外积),那么它会变得更加简单。 2D 卷积可以表示为在行上然后在列上的一维卷积(反之亦然)。使用 DFT 进行模糊也是如此。

【讨论】:

    【解决方案2】:

    尝试使用 BlurMaskFilter。

    使用示例:

    http://www.anddev.org/decorated_and_animated_seekbar_tutorial-t10937.html

    【讨论】:

    • 我读到这只能模糊图像的边缘,而不是整个图像。在我尝试自己做模糊之前,我为此搜索了很多 - 但没有这样做。 ;-)
    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 2011-01-05
    • 2014-01-20
    • 2021-12-11
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多