Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何模糊位图(Android)?_Android_Bitmap_Blur - Fatal编程技术网

如何模糊位图(Android)?

如何模糊位图(Android)?,android,bitmap,blur,Android,Bitmap,Blur,我正在努力使用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

我正在努力使用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中还有什么可用的吗?

尝试使用BlurMaskFilter

用法示例:


您所做的基本上是原始图像I和内核K之间的二维卷积(内核实际上是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本机接口)

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


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

据我了解,这只能模糊图像的边缘,而不能模糊整个图像。在我尝试独自制作模糊之前,我在谷歌上搜索了很多,但都失败了有关Android的完整复制和粘贴快速位图模糊实现,请参见我的答案: