PHP/GD 高斯模糊效果

10

我需要使用PHP和GD模糊图像的特定区域,目前我正在使用以下代码:

for ($x = $_GET['x1']; $x < $_GET['x2']; $x += $pixel)
{
    for ($y = $_GET['y1']; $y < $_GET['y2']; $y += $pixel)
    {
        ImageFilledRectangle($image, $x, $y, $x + $pixel - 1, $y + $pixel - 1, ImageColorAt($image, $x, $y));
    }
}

这基本上是用$pixel像素的正方形替换了所选区域。我想实现某种模糊效果(最好是高斯效果),我知道可以使用ImageFilter()函数:

ImageFilter($image, IMG_FILTER_GAUSSIAN_BLUR);

但它会模糊整个画布,我的问题是我只想要模糊特定的区域。

2个回答

13

你可以将图像的特定部分复制到一个新图像中,对新图像应用模糊效果,然后将结果复制回原图像。

就像这样:

$image2 = imagecreate($width, $height);
imagecopy  ( $image2  , $image  , 0  , 0  , $x  , $y  , $width  , $height);
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
imagecopy ($image, $image2, $x, $y, 0, 0, $width, $height);

确实,这是一个不错的解决方法,但我仍然想知道如何手动创建模糊效果。 - Alix Axel
您可以在维基百科上查找此内容:http://en.wikipedia.org/wiki/Gaussian_blur#Implementation 或查看StackOverflow上的类似帖子:https://dev59.com/CnVD5IYBdhLWcg3wE3Xz,但我建议使用内置库。这些库使用编译后的算法来加速处理过程。 - Scharrels
我采纳了你给我的建议,现在我需要在所选区域上循环使用ImageFilter 128来混淆它,也许使用自定义实现可以更快地得到结果。 - Alix Axel
你肯定是想将滤镜应用于 $image2 而不是 $image(以模糊特定区域而不是除特定区域外的所有内容)。 - SEoF

2

我没有检查imagefilter的文档,也不知道是否不可能或者是否有类似于将其应用于图像(部分)的等效方法。但是假设没有这样的方法,为什么不这样做:

  1. 将您想要模糊的部分复制到一个新的(临时的)GD图像中(无需将其写入磁盘,只需将其分配给新的临时变量)。
  2. 对此临时图像应用高斯模糊滤镜。
  3. 将结果(过滤后的)图像直接复制回原来的位置(执行此功能的功能肯定在GD库中)。

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