2011-08-30 31 views
14

quiero desenfocar una imagen con librería GD, por desgracia, el efecto GAUSSIAN_BLUR que da GD no es suficiente y quiero algo siendo más blurrishPHP/GD: Mejor desenfoque gaussiano

<?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); 

quiero algo así o al menos cerca de él. image from //tutorial9.s3.amazonaws.com/uploads/2008/06/lens-blur.jpg

Respuesta

13

Usted puede tratar de convolución:

$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 es una matriz, por lo que matemáticamente de

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

se pueden encontrar otros filtros de convolución en: http://aishack.in/tutorials/image-convolution-examples/

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

por lo desde TH e código anterior 1+2+1+2+4+2+1+2+1 = 16 la suma de la matriz. http://www.php.net/manual/en/function.imageconvolution.php#97921 es un buen truco para obtener la suma del divisor.

echa un vistazo a http://php.net/manual/en/function.imageconvolution.php para obtener más información sobre esta función.

buen ol' borrón moda es (1,2,1), (2,1,2), (1,2,1)

EDIT: as stated below puede ejecutar cualquier filtro más una vez en la salida resultante para mejorar también el efecto.

+0

no está cerca de lo que quiero pero gracias, otra manera de difuminar más ?? EDIT: lo siento, no leí tu edición, mirando los ejemplos, ¡gracias! – SAFAD

+1

parece que esta matriz: matriz (2.0, 3.0, 2.0), matriz (3.0, 6.0, 3.0), matriz (2.0, 3.0, 2.0) es la matriz más grande que esta función puede leer, he leído que las matrices de 5x5 pueden hacer desenfoque mejor y más fuerte, alguna idea? – SAFAD

+0

usando la función varias veces dio el resultado que quiero, sin embargo, no es la mejor solución * seguro * – SAFAD

1

No estoy seguro de si los argumentos del filtro de imagen ayudan, pero compruébelo.

¿Alternativamente, simplemente aplica el filtro de imagen a su resultado un par de veces?

20

Después de encontrarme con el mismo problema, apliqué el mismo filtro unas cuantas veces, y cada vez al recurso resultante de la llamada anterior de "filtro de imagen". Obtuve el efecto 'más borroso' que estás buscando.

por ejemplo:

for ($x=1; $x<=15; $x++) 
    imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR); 
+1

esta debería ser la respuesta correcta – younes0

+1

Lo he usado yo mismo, así que puedo asegurarle que funciona como se esperaba. –

+8

Lo he usado, pero esto es insoportablemente lento. –

1

intente esto:

<?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); 
?> 
0

Tengo muy buen resultado con el siguiente código basado en this solución:

for ($i = 0; $i < 25; $i++) { 
     if ($i % 10 == 0) {//each 10th time apply 'IMG_FILTER_SMOOTH' with 'level of smoothness' set to -7 
      imagefilter($tmp_dst_image, IMG_FILTER_SMOOTH, -7); 
     } 
     imagefilter($tmp_dst_image, IMG_FILTER_GAUSSIAN_BLUR); 
    } 

Cuando se aplica sin problemas después de varios borrones ofrece muy buen efecto borroso. Puede experimentar con el siguiente número en el código: 25, 10, -7.

Consulte también:How to measure the speed of code written in PHP