2011-08-30 15 views
14

voglio offuscare un'immagine con libreria GD, purtroppo l'effetto GAUSSIAN_BLUR che GD dà non è sufficiente e voglio qualcosa di essere più blurrishPHP/GD: Meglio sfocatura gaussiana

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

voglio qualcosa come questo o almeno vicino ad esso. image from //tutorial9.s3.amazonaws.com/uploads/2008/06/lens-blur.jpg

risposta

13

Si può provare convoluzione:

$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 è una matrice, in modo matematicamente E '

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

si possono trovare altri filtri di convoluzione a: http://aishack.in/tutorials/image-convolution-examples/

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

così da th codice sopra 1+2+1+2+4+2+1+2+1 = 16 la somma della matrice. http://www.php.net/manual/en/function.imageconvolution.php#97921 è un trucco perfetto per ottenere la somma del divisore da .

check out http://php.net/manual/en/function.imageconvolution.php per ulteriori informazioni su questa funzione.

good ol' sfocatura moda è (1,2,1), (2,1,2), (1,2,1)

EDIT: as stated below è possibile eseguire qualsiasi filtro più di una volta sull'output risultante per migliorare anche l'effetto.

+0

non vicino a quello che voglio ma grazie, un altro modo per sfocare più ?? EDIT: sorry non ha letto la tua modifica, esaminando gli esempi, grazie! – SAFAD

+1

sembra come questa matrice: array (2.0, 3.0, 2.0), array (3.0, 6.0, 3.0), array (2.0, 3.0, 2.0) è la matrice più grande che questa funzione può leggere, ho letto che le matrici 5x5 possono fare sfocatura migliore e più forte, qualche idea? – SAFAD

+0

utilizzando la funzione più volte ha dato il risultato che voglio, ma non è la soluzione migliore là fuori * di sicuro * – SAFAD

1

Non sono sicuro che gli argomenti del filtro immagine siano di aiuto, ma controllali.

In alternativa, è sufficiente applicare il filtro immagine al suo risultato un paio di volte ???

20

Dopo aver riscontrato lo stesso problema, ho applicato lo stesso filtro alcune volte e ogni volta alla risorsa risultante della precedente chiamata "imagefilter". Ho l'effetto "più sfocato" che stai cercando.

esempio:

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

questa dovrebbe essere la risposta giusta – younes0

+1

L'ho usata io stesso, quindi posso assicurarti che funziona come previsto. –

+8

Ho usato questo, ma questo è insopportabilmente lento. –

1

provare questo:

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

devo ottimo risultato con il seguente codice in base a this soluzione:

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

Quando si applica liscia dopo diversi sfocature offre un ottimo effetto sfocato. Puoi provare con il seguente numero nel codice: 25, 10, -7.

Consulta anche:How to measure the speed of code written in PHP