2009-08-08 73 views
10

我需要使用PHP和GD进行模糊处理的图像的某个区域,我目前使用下面的代码: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)); 
    } 
} 

这基本上替换$的平方选定区域像素像素。我要完成某种模糊的(高斯最好)的效果,我知道我可以使用此ImageFilter()函数:

ImageFilter($image, IMG_FILTER_GAUSSIAN_BLUR); 

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

回答

12

您可以将图像的特定部分复制到新图像中,在新图像上应用模糊并将结果复制回来。

排序是这样的:

$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); 
+0

事实上,这是一个很好的解决办法,但是我还是想知道如何手动创建一个模糊效果。 – 2009-08-08 13:48:43

+0

你可以在wikipedia上查看:http://en.wikipedia.org/wiki/Gaussian_blur#Implementation或者查看StackOverflow上的类似帖子:http://stackoverflow.com/questions/98359/fastest-gaussian-blur-实现,但我会建议使用内置库。这些库使用编译算法来加速进程。 – Scharrels 2009-08-08 14:09:47

+0

我接受了你给我的建议,我必须在选定区域循环ImageFilter 128来混淆它,也许使用自定义实现我可以更快地获得结果。 – 2009-08-08 22:47:36

2

我没有检查ImageFilter的文档,我不知道这是不可能的,或者如果有一个相当于一个将其应用到(部分)图片。不过,假设没有,为什么不:

  1. 要模糊到一个新的(临时)GD图像(无需将其写入到磁盘,只需将其分配给一个新的临时变量)的部分复制。
  2. 将高斯模糊滤镜应用于此临时图像。
  3. 复制生成的(过滤)图像右后卫它来自何处(功能做到这一点绝对是GD库)