PHP 8.4.2 Released!

Uso básico

Imagick hace que la manipulación de imágenes en PHP sea extremadamente sencilla a través de una interfaz OO. Aquí está un ejemplo breve de cómo hacer una miniatura:

Ejemplo #1 Crear una miniatura con Imagick

<?php

header
('Content-type: image/jpeg');

$imagen = new Imagick('imagen.jpg');

// Si se proporciona 0 como parámetro de ancho o alto,
// se mantiene la proporción de aspecto
$imagen->thumbnailImage(100, 0);

echo
$imagen;

?>

Al usar SPL y otras características OO soportadas en Imagick, puede ser sencillo redimensionar todos los archivos de un directorio (útil para la redimensión por lotes de muchas imágenes de cámara digital para que sean visibles desde una web). Aquí usamos redimensión, ya que queremos mantener cierta meta-información:

Ejemplo #2 Hacer una miniatura de todos los archivos JPG de un directorio

<?php

$imágenes
= new Imagick(glob('imagenes/*.JPG'));

foreach(
$imágenes as $imagen) {

// Proporcionar 0 fuerza a thumbnailImage a mantener la proporción de aspecto
$imagen->thumbnailImage(1024,0);

}

$imágenes->writeImages();

?>

Este es un ejemplo de crear un reflejo de una imagen. El reflejo se crea volteando la imagen y poniendo una capa de gradiente sobre ella. Ambas, la imagen original y el reflejo, están sobrepuestas en un lienzo.

Ejemplo #3 Crear un reflejo de una imagen

<?php
/* Leer la imagen */
$im = new Imagick("test.png");

/* Miniaturizar la imagen */
$im->thumbnailImage(200, null);

/* Crear un borde para la imagen */
$im->borderImage(new ImagickPixel("white"), 5, 5);

/* Clonar la imagen y voltearla */
$reflejo = $im->clone();
$reflejo->flipImage();

/* Crear un gradiente. Será sobrepuesto en el reflejo */
$gradiente = new Imagick();

/* El gradiente necesita ser más grande que la imagen y los bordes */
$gradiente->newPseudoImage($reflejo->getImageWidth() + 10, $reflejo->getImageHeight() + 10, "gradient:transparent-black");

/* Componer el gradiente con el reflejo */
$reflejo->compositeImage($gradiente, imagick::COMPOSITE_OVER, 0, 0);

/* Añadir algo de opacidad. Requiere ImageMagick 6.2.9 o superior */
$reflejo->setImageOpacity( 0.3 );

/* Crear un lienzo vacío */
$lienzo = new Imagick();

/* El lienzo necesita ser más grande para mantener ambas imágenes */
$ancho = $im->getImageWidth() + 40;
$alto = ($im->getImageHeight() * 2) + 30;
$lienzo->newImage($ancho, $alto, new ImagickPixel("black"));
$lienzo->setImageFormat("png");

/* Componer la imagen original y el reflejo sobre el lienzo */
$lienzo->compositeImage($im, imagick::COMPOSITE_OVER, 20, 10);
$lienzo->compositeImage($reflejo, imagick::COMPOSITE_OVER, 20, $im->getImageHeight() + 10);

/* Imprimir la imagen */
header("Content-Type: image/png");
echo
$lienzo;
?>

El resultado del ejemplo sería algo similar a:

Salida del ejemplo : Crear un reflejo de una imagen

Este ejemplo ilustra cómo usar patrones de relleno durante el dibujo.

Ejemplo #4 Rellenar un texto con un gradiente

<?php

/* Crear un nuevo objeto imagick */
$im = new Imagick();

/* Crear una nueva imagen. Será usada como patrón de relleno */
$im->newPseudoImage(50, 50, "gradient:red-black");

/* Crear un objeto imagickdraw */
$dibujo = new ImagickDraw();

/* Iniciar un nuevo patrón llamado "gradient" */
$dibujo->pushPattern('gradient', 0, 0, 50, 50);

/* Componer el gradiente con el patrón */
$dibujo->composite(Imagick::COMPOSITE_OVER, 0, 0, 50, 50, $im);

/* Cerrar el patrón */
$dibujo->popPattern();

/* Usar el patrón llamado "gradient" como el relleno */
$dibujo->setFillPatternURL('#gradient');

/* Establecer el tamaño de fuente a 52 */
$dibujo->setFontSize(52);

/* Anotar algo de texto */
$dibujo->annotation(20, 50, "Hello World!");

/* Crear un nuevo lienzo y una imagen blanca */
$lienzo = new Imagick();
$lienzo->newImage(350, 70, "white");

/* Dibujar el objeto ImagickDraw sobre el lienzo */
$lienzo->drawImage($dibujo);

/* Borde negro de 1px alrededor de la imagen */
$lienzo->borderImage('black', 1, 1);

/* Establecer el formato a PNG */
$lienzo->setImageFormat('png');

/* Imprimir la imagen */
header("Content-Type: image/png");
echo
$lienzo;
?>

El resultado del ejemplo sería algo similar a:

Salida del ejemplo : Rellenar texto con gradiente

Trabajar con imágenes GIF animadas

Ejemplo #5 Leer una imágen GIF y redimensionar todos los fotogramas

<?php

/* Crear un nuevo objeto imagick y leer el GIF */
$im = new Imagick("ejemplo.gif");

/* Redimensionar todos los fotogramas */
foreach ($im as $fotograma) {
/* Fotogramas de 50x50 */
$fotograma->thumbnailImage(50, 50);

/* Establecer el lienzo virtual para corregir el tamaño */
$fotograma->setImagePage(50, 50, 0, 0);
}

/* Observe: writeImages en vez de writeImage */
$im->writeImages("example_small.gif", true);
?>

Trabajar con primitivas de elipse y tipos de letra personalizados

Ejemplo #6 Crear un logo de PHP

<?php
/* Establecer el ancho y alto en proporción al logo genuino de PHP */
$ancho = 400;
$alto = 210;

/* Crear un objeto Imagick con lienzo transparente */
$img = new Imagick();
$img->newImage($ancho, $alto, new ImagickPixel('transparent'));

/* Nueva instancia de ImagickDraw para dibujar la elipse */
$dibujo = new ImagickDraw();
/* Establecer el color de relleno púrpura para la elipse */
$dibujo->setFillColor('#777bb4');
/* Establecer las dimensiones de la elipse */
$dibujo->ellipse($ancho / 2, $alto / 2, $ancho / 2, $alto / 2, 0, 360);
/* Dibujar la elipse en el lienzo */
$img->drawImage($dibujo);

/* Restablecer el color de relleno de púrpura a negro para el texto (nota: estamos reutilizando el objeto ImagickDraw) */
$dibujo->setFillColor('black');
/* Establecer el borde del contorno al color blanco */
$dibujo->setStrokeColor('white');
/* Establecer el grosor del borde del contorno */
$dibujo->setStrokeWidth(2);
/* Establecer el interletraje («kerning») del tipo de letra (un valor negativo significa que las letras están más juntas entre ellas) */
$dibujo->setTextKerning(-8);
/* Establecer el tamaño del tipo de letra usado para el logo de PHP */
$dibujo->setFont('Handel Gothic.ttf');
$dibujo->setFontSize(150);
/* Centrar el texto horizontal y verticalmente */
$dibujo->setGravity(Imagick::GRAVITY_CENTER);

/* Añadir en el centro "php" con el índice Y de -10 al lienzo (dentro de la elipse) */
$img->annotateImage($dibujo, 0, -10, 0, 'php');
$img->setImageFormat('png');

/* Establecer la cabecera apropiada para PNG y generar la imagen */
header('Content-Type: image/png');
echo
$img;
?>

El resultado del ejemplo sería algo similar a:

Salida del ejemplo: Crear el logo de PHP con Imagick

add a note

User Contributed Notes 2 notes

up
36
vokseli
10 years ago
Be careful when loading multiple images by passing an array to a new Imagick object. This is from Example #2:

<?php

$images
= new Imagick(glob('images/*.JPG'));

?>

If you have lots of images inside the images folder, PHP will consume a lot of memory, ergo it is not recommended. I personally think it's a better idea to loop each image separately:

<?php

$image_files
= glob('images/*.JPG');

foreach (
$image_files as $image_file) {
$image = new Imagick($image_file);
// Do something for the image and so on...
}

?>

This way only a single image is fitted into the memory at a time.
up
18
inoshadi at gmail dot com
11 years ago
on Example #3 Creating a reflection of an image
----------------------------------------------------
/* Clone the image and flip it */
$reflection = $im->clone();
$reflection->flipImage();
----------------------------------------------------
it was using the Imagick::clone function

This function has been DEPRECATED as of imagick 3.1.0 in favour of using the clone keyword.

use below code instead:
----------------------------------------------------
/* Clone the image and flip it */
$reflection = clone $im;
$reflection->flipImage();
----------------------------------------------------

http://php.net/manual/en/imagick.clone.php
To Top