PHP/GD : Better Gaussian blur
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.
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);
try this:
<?php
//
//fastblur function from image hosting and processing site http://hero-in.com
//
function blur($img, $radius=10)
{
if ($radius>100) $radius=100; //max radius
if ($radius<0) $radius=0; //nin radius
$radius=$radius*4;
$alphaStep=round(100/$radius)*1.7;
$width=imagesx($img);
$height=imagesy($img);
$beginX=floor($radius/2);
$beginY=floor($radius/2);
//make clean imahe sample for multiply
$cleanImageSample=imagecreatetruecolor($width, $height);
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);
//make h blur
for($i = 1; $i < $radius+1; $i++)
{
$xPoint=($beginX*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, $xPoint, 0, 0, 0, $width, $height, $alphaStep);
}
//make v blur
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);
for($i = 1; $i < $radius+1; $i++)
{
$yPoint=($beginY*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, 0, $yPoint, 0, 0, $width, $height, $alphaStep);
}
//finish
return $img;
imagedestroy($cleanImageSample);
}
//example
$im = ImageCreateFromJpeg('image.jpg');
$im = blur($im,10);
imagejpeg($im)
imagedestroy($im);
?>