Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP/GD : Better Gaussian blur

I want to blur an image with GD library, unfortunately the GAUSSIAN_BLUR effect that GD gives isn't enough and i want something being more blurrish

<?php $im = imagecreatefrompng($_GET['image']);
if($im && imagefilter($im, IMG_FILTER_GAUSSIAN_BLUR))
{
  header('Content-Type: image/png');
    imagepng($im);
}
else
{
    echo 'fail';
}

imagedestroy($im);

I want something like this or at least near it. image from //tutorial9.s3.amazonaws.com/uploads/2008/06/lens-blur.jpg

like image 442
SAFAD Avatar asked Aug 30 '11 15:08

SAFAD


2 Answers

After coming across the same problem, I applied the same filter a few times, and each time to the resulting resource of the previous "imagefilter" call. I got the 'more blurry' effect you're looking for.

e.g.:

for ($x=1; $x<=15; $x++)
   imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
like image 180
Andrei Oniga Avatar answered Sep 19 '22 21:09

Andrei Oniga


You can try convolution:

$gaussian = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0));
imageconvolution($image, $gaussian, 16, 0);

$gaussian is a matrix, so mathematically it's

[[1, 2, 1],
 [2, 4, 2],
 [1, 2, 1]]

you can find other convolution filters at: http://aishack.in/tutorials/image-convolution-examples/

imageconvolution( <image element>, <convolution matrix>, <divisor (sum of convolution matrix)>, <color offset>);

so from the code above 1+2+1+2+4+2+1+2+1 = 16 the sum of the matrix. http://www.php.net/manual/en/function.imageconvolution.php#97921 is a neat trick for getting the sum of the divisor.

check out http://php.net/manual/en/function.imageconvolution.php for more info on this function.

good ol' fashion blur is (1,2,1),(2,1,2),(1,2,1)

EDIT: as stated below you can run any filter more than once on the resulting output to also enhance the effect.

like image 45
JKirchartz Avatar answered Sep 17 '22 21:09

JKirchartz