Saltar al contenido

php – La mejor manera de desenfocar imágenes

Adrián, miembro de este gran equipo de trabajo, nos ha hecho el favor de redactar este tutorial porque conoce perfectamente el tema.

Solución:

Intente reducir la imagen y aplique el bucle con desenfoque gaussiano en la imagen redimensionada. De esa manera, ahorrará algo de rendimiento en imágenes grandes:

header('Content-Type: image/jpeg');
$file = '1.jpg';
$image = imagecreatefromjpeg($file);

    /* Get original image size */
    list($w, $h) = getimagesize($file);

    /* Create array with width and height of down sized images */
    $size = array('sm'=>array('w'=>intval($w/4), 'h'=>intval($h/4)),
                   'md'=>array('w'=>intval($w/2), 'h'=>intval($h/2))
                  );                       

    /* Scale by 25% and apply Gaussian blur */
    $sm = imagecreatetruecolor($size['sm']['w'],$size['sm']['h']);
    imagecopyresampled($sm, $image, 0, 0, 0, 0, $size['sm']['w'], $size['sm']['h'], $w, $h);

    for ($x=1; $x <=40; $x++)
        imagefilter($sm, IMG_FILTER_GAUSSIAN_BLUR, 999);
     

    imagefilter($sm, IMG_FILTER_SMOOTH,99);
    imagefilter($sm, IMG_FILTER_BRIGHTNESS, 10);        

    /* Scale result by 200% and blur again */
    $md = imagecreatetruecolor($size['md']['w'], $size['md']['h']);
    imagecopyresampled($md, $sm, 0, 0, 0, 0, $size['md']['w'], $size['md']['h'], $size['sm']['w'], $size['sm']['h']);
    imagedestroy($sm);

        for ($x=1; $x <=25; $x++)
            imagefilter($md, IMG_FILTER_GAUSSIAN_BLUR, 999);
         

    imagefilter($md, IMG_FILTER_SMOOTH,99);
    imagefilter($md, IMG_FILTER_BRIGHTNESS, 10);        

/* Scale result back to original size */
imagecopyresampled($image, $md, 0, 0, 0, 0, $w, $h, $size['md']['w'], $size['md']['h']);
imagedestroy($md);  

// Apply filters of upsized image if you wish, but probably not needed
//imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR); 
//imagefilter($image, IMG_FILTER_SMOOTH,99);
//imagefilter($image, IMG_FILTER_BRIGHTNESS, 10);       

imagejpeg($image);
imagedestroy($image);

Tomé prestada la idea de reducción y parte del código de esta respuesta

He probado la solución con tu imagen, y el resultado:

ingrese la descripción de la imagen aquí

Puede elaborar y aumentar/disminuir el desenfoque cambiando el número de bucles para la imagen pequeña. si cambias for ($x=1; $x <=40; $x++){ a for ($x=1; $x <=75; $x++){ Obtendrás más desenfoque.

La desventaja de esta solución es que obtendrá una pixelación visible debido al cambio de tamaño. La ventaja es un mejor rendimiento, menos carga del servidor y menos tiempo de ejecución en comparación con si aplicara el bucle de desenfoque en la imagen de tamaño original.

También enfrenté este problema en mi proyecto esa vez que uso un código largo pero creo que ese código no es adecuado y creé mi propio código pequeño, aquí está ese código

header("content-type: image/png");
$image = imagecreatefromjpeg("abc.jpg");
for ($x=1; $x<=50; $x++)

 imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);

imagepng($image);
imagedestroy($image);

Si te mola el tema, tienes la libertad de dejar un post acerca de qué te ha impresionado de este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *