Search code examples
phpgdblurimagefilter

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


Solution

  • 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.