2009-08-08 30 views
10

necesito para ocultar un área determinada de una imagen con PHP y GD, actualmente estoy usando el siguiente código:PHP/GD gaussiano Efecto

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

Esto básicamente reemplaza el área seleccionada con cuadrados de $ píxeles de píxeles. Quiero lograr algún tipo de desenfoque (gaussiano preferentemente) efecto, sé que puedo utilizar la función ImageFilter():

ImageFilter($image, IMG_FILTER_GAUSSIAN_BLUR); 

Pero difumina todo el lienzo, mi problema es que sólo quiero difuminar una específica zona.

Respuesta

12

Puede copiar una parte específica de la imagen en una nueva imagen, aplicar el desenfoque en la nueva imagen y copiar el resultado.

Algo así como esto:

$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

De hecho, esta es una buena solución, sin embargo aun así me gustaría saber cómo manualmente crea un efecto borroso –

+0

Puedes buscar esto en wikipedia: http://en.wikipedia.org/wiki/Gaussian_blur#Implementation o ver publicaciones similares en StackOverflow: http://stackoverflow.com/questions/98359/fastest-gaussian-blur- implementación, pero recomendaría usar una biblioteca incorporada. Estas bibliotecas usan algoritmos compilados para acelerar el proceso. – Scharrels

+0

Tomé la sugerencia que me diste y tengo que hacer un loop de ImageFilter 128 en el área seleccionada para ofuscarlo, tal vez usando una implementación personalizada, puedo obtener el resultado más rápidamente. –

2

no el registro de la documentación para imagefilter y no sé si esto es imposible, o si hay un equivalente a aplicar esto a (una parte) de una imagen. Pero suponiendo que no lo es, ¿por qué no:

  1. Copiar la parte que desea difuminar una nueva imagen (temporal) a GD (sin necesidad de escribir en el disco, simplemente asignarla a una nueva variable temp).
  2. Aplicar filtro de desenfoque gaussiano a esta imagen temporal.
  3. Copiar la imagen resultante (filtrada) de vuelta de donde vino (funcionalidad de hacer esto es sin duda en la biblioteca GD)