Ejemplo efecto espejo con Imagick

  • Por
  • PHP
Analizamos un ejemplo algo más complejo para estudiar la utilización de Imagick en PHP.
Ya conocemos el funcionamiento de Imagick, por lo que vamos a pasar a realizar un ejemplo un poco más complejo, para ya en el siguiente artículo trabajar con algún otro ejemplo real sobre 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;

Autor

Sara Alvarez

Equipo DesarrolloWeb.com

Compartir