2009-08-08 6 views
10

ho bisogno di offuscare una determinata area di un'immagine utilizzando PHP e GD, attualmente sto usando il seguente codice:PHP/GD Controllo sfocatura Effetto

for ($x = $_GET['x1']; $x < $_GET['x2']; $x += $pixel) 
{ 
    for ($y = $_GET['y1']; $y < $_GET['y2']; $y += $pixel) 
    { 
     ImageFilledRectangle($image, $x, $y, $x + $pixel - 1, $y + $pixel - 1, ImageColorAt($image, $x, $y)); 
    } 
} 

Questo sostituisce in pratica l'area selezionata con piazze di $ pixel pixel. Che voglio realizzare una sorta di sfocatura (gaussiana preferibilmente) effetto, so di poter utilizzare la) Funzione ImageFilter (:

ImageFilter($image, IMG_FILTER_GAUSSIAN_BLUR); 

Ma offusca la intera area, il mio problema è che voglio solo offuscare una specifica la zona.

risposta

12

È possibile copiare una parte specifica dell'immagine in una nuova immagine, applicare la sfocatura sulla nuova immagine e copiare il risultato.

Un po 'come questo:

$image2 = imagecreate($width, $height); 
imagecopy ($image2 , $image , 0 , 0 , $x , $y , $width , $height); 
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR); 
imagecopy ($image, $image2, $x, $y, 0, 0, $width, $height); 
+0

In effetti, questo è un bel soluzione però mi vorrebbe ancora sapere come manualmente crea un effetto sfocato. –

+0

Puoi cercare su wikipedia: http://en.wikipedia.org/wiki/Gaussian_blur#Implementation o guardare post simili su StackOverflow: http://stackoverflow.com/questions/98359/fastest-gaussian-blur- implementazione ma raccomanderei l'uso di una libreria integrata. Queste librerie utilizzano algoritmi compilati per accelerare il processo. – Scharrels

+0

Ho preso il suggerimento che mi hai dato e devo fare un loop di ImageFilter 128 sull'area selezionata per offuscarlo, magari usando un'implementazione personalizzata. Posso ottenere il risultato più velocemente. –

2

non ho controllato la documentazione per ImageFilter e non so se questo è impossibile, o se c'è un equivalente per l'applicazione di questo a (una parte) di un Immagine. Ma supponendo che non c'è, perché non:

  1. copiare la parte che si desidera sfumare per una nuova immagine GD (temporanea) (non c'è bisogno di scrivere su disco, basta assegnarlo ad una nuova variabile temp).
  2. Applica il filtro sfocatura gaussiana a questa immagine temporanea.
  3. Copiare il (filtrata) immagine risultante destra indietro da dove è venuto (funzionalità per fare questo è sicuramente nella libreria GD)