Analizamos un ejemplo algo más complejo para estudiar la utilización de Imagick en PHP.
El ejemplo de hoy consiste en crear un reflejo a una imagen que cargamos en un lienzo. Luego volteamos la imagen y le colocamos una capa con un degradado para hacerlo algo menos opaco.
Vamos a comenzar a ver las lineas de código:
Creamos el objeto con la imagen a la que queremos hacer el reflejo.
$im= new Imagick("imagen.png");
Creamos una miniatura adecuada al tamaño que queremos mostrar. Esto ya hemos visto cómo se hace.
$im->thumbnailImage(200, null);
Clonamos la imagen para poder voltearla y posicionarla sobre la original
$reflejo = $im->clone();
$reflejo->flipImage();
Ahora lo que vamos a hacer es crear el gradiente para ponerlo sobre la imagen clonada. Para ello generamos un lienzo vacío.
$gradiente = new Imagick();
Para que todo quede bien, el degradado transparente tiene que ser más grande que la imagen.
$gradiente->newPseudoImage($reflejo->getImageWidth() + 5, $reflejo->getImageHeight() + 5, "gradient:transparent-black");
El siguiente paso es colocar el degradado sobre el reflejo y componer la nueva capa con ambos.
$reflejo->compositeImage($gradiente, imagick::COMPOSITE_OVER, 0, 0);
Como complemento podemos añadir algo más de opacidad al reflejo:
$reflejo->setImageOpacity(0,2);
Con esto ya tenemos el reflejo creado, ahora nos queda colocarlo en la imagen original para insertar la imagen deseada con el reflejo.
Es importante acordarse de que vamos a colocar ambas imágenes (original y reflejo), por lo que debemos crear un lienzo más grande que el de la imagen original.
$alto= ($im->gegImageHeight() * 2 )+10;
$ancho = $im->getImageWidth() +10;
$lienzo->newImage($ancho, $alto, new ImagickPixel("black"));
$lienzo->setImageFormat("png");
$lienzo-> compositeImage ($im, imagick::COMPOSITE_OVER, 5, 5);
$lienzo-> compositeImage ($reflejo, imagick::COMPOSITE_OVER, 5, $im->getImageHeight() + 5);
Con esto ya tenemos nuestro reflejo creado y tan sólo nos faltaría pues mostrarlo en nuestra web, subirlo a nuestra carpeta, imprimirlo o lo que queremos hacer con él.
Para nuestro artículo lo que vamos a hacer es mostrarlo directamente en pantalla.
Header("Content-Type: image/png");
echo $lienzo;
Para terminar, os dejo todo el código completo y el resultado obtenido al realizarlo:
Imagen incial:
$im = new Imagick("imagenoriginal.png");
$im->thumbnailImage(200, null);
$reflejo = $im->clone();
$reflejo->flipImage();
$gradiente = new Imagick();
$gradiente->newPseudoImage($reflejo->getImageWidth() + 5, $reflejo->getImageHeight() + 5, "gradient:transparent-black");
$reflejo->compositeImage($gradiente, imagick::COMPOSITE_OVER, 0, 0);
$reflejo->setImageOpacity( 0.2 );
$lienzo = new Imagick();
$alto = ($im->getImageHeight() * 2) + 10;
$ancho = $im->getImageWidth() + 10;
$lienzo->newImage($ancho, $alto, new ImagickPixel("black"));
$lienzo->setImageFormat("gif");
$lienzo->compositeImage($im, imagick::COMPOSITE_OVER, 5, 5);
$lienzo->compositeImage($reflejo, imagick::COMPOSITE_OVER, 5, $im->getImageHeight() + 5);
header("Content-Type: image/png");
echo $lienzo;