PHP Conference Nagoya 2025

Uso básico

Imagick faz com que a manipulação de imagem no PHP seja extremamente fácil através de uma interface orientada a objetos. Aqui está um exemplo rápido de como criar uma miniatura:

Exemplo #1 Criando uma miniatura em Imagick

<?php

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

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

// Se 0 for informado em um parâmetro de largura ou altura,
// a razão de aspecto é mantida
$image->thumbnailImage(100, 0);

echo
$image;

?>

Usando SPL e outros recursos OO suportados no Imagick, pode ser simples redimensionar todos os arquivos em um diretório (útil para redimensionar em lote grandes imagens de câmeras digitais para serem visualizadas na web). Aqui usamos redimensionamento, pois podemos querer reter certos metadados:

Exemplo #2 Criando uma miniatura de todos os arquivos JPG em um diretório

<?php

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

foreach(
$images as $image) {

// Informar 0 vai forçar a miniatura a manter a razão de aspecto
$image->thumbnailImage(1024,0);

}

$images->writeImages();

?>

Este é um exemplo de criação do reflexo de uma imagem. O reflexo é criado invertendo a imagem e sobrepondo um gradiente nela. Em seguida, a imagem original e o reflexo são sobrepostos em uma tela.

Exemplo #3 Criando o reflexo de uma imagem

<?php
/* Lê a imagem */
$im = new Imagick("teste.png");

/* Faz a miniatura da imagem */
$im->thumbnailImage(200, null);

/* Cria uma borda para a imagem */
$im->borderImage(new ImagickPixel("white"), 5, 5);

/* Clona e inverte a imagem */
$reflection = $im->clone();
$reflection->flipImage();

/* Cria um gradiente. Ele será sobreposto no reflexo */
$gradient = new Imagick();

/* O gradiente precisa ser grande o suficiente para a imagem e para as bordas */
$gradient->newPseudoImage($reflection->getImageWidth() + 10, $reflection->getImageHeight() + 10, "gradient:transparent-black");

/* Compõe o gradiente no reflexo */
$reflection->compositeImage($gradient, imagick::COMPOSITE_OVER, 0, 0);

/* Adiciona um pouco de opacidade. Requer ImageMagick 6.2.9 ou superior */
$reflection->setImageOpacity( 0.3 );

/* Cria uma tela vazia */
$canvas = new Imagick();

/* A tela precisa ser grande o suficiente para conter as duas imagens */
$width = $im->getImageWidth() + 40;
$height = ($im->getImageHeight() * 2) + 30;
$canvas->newImage($width, $height, new ImagickPixel("black"));
$canvas->setImageFormat("png");

/* Compõe a imagem original e o reflexo na tela */
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 20, 10);
$canvas->compositeImage($reflection, imagick::COMPOSITE_OVER, 20, $im->getImageHeight() + 10);

/* Mostra a imagem */
header("Content-Type: image/png");
echo
$canvas;
?>

O exemplo acima produzirá algo semelhante a:

Saída do exemplo : Criando o reflexo de uma imagem

Este exemplo ilustra como usar padrões de preenchimento no desenho.

Exemplo #4 Preenchendo texto com gradiente

<?php

/* Cria um novo objeto Imagick */
$im = new Imagick();

/* Cria uma nova imagem que será usada como padrão de preenchimento */
$im->newPseudoImage(50, 50, "gradient:red-black");

/* Cria objeto ImagickDraw */
$draw = new ImagickDraw();

/* Inicia um padrão chamado "gradiente" */
$draw->pushPattern('gradiente', 0, 0, 50, 50);

/* Compõe o gradiente no padrão */
$draw->composite(Imagick::COMPOSITE_OVER, 0, 0, 50, 50, $im);

/* Fecha o padrão */
$draw->popPattern();

/* Usa o padrão chamado "gradiente" como preenchimento */
$draw->setFillPatternURL('#gradiente');

/* Define o tamanho da fonte para 52 */
$draw->setFontSize(52);

/* Escreve um texto */
$draw->annotation(20, 50, "Hello World!");

/* Cria um novo objeto de tela e uma imagem branca */
$canvas = new Imagick();
$canvas->newImage(350, 70, "white");

/* Desenha o ImagickDraw na tela */
$canvas->drawImage($draw);

/* borda preta de 1 pixel em torno da imagem */
$canvas->borderImage('black', 1, 1);

/* Define o formato para PNG */
$canvas->setImageFormat('png');

/* Mostra a imagem */
header("Content-Type: image/png");
echo
$canvas;
?>

O exemplo acima produzirá algo semelhante a:

Saída do exemplo : Preenchendo texto com gradiente

Trabalhando com GIFs animados

Exemplo #5 Lê a imagem GIF e redimensiona todos os quadros

<?php

/* Cria um novo objeto Imagick e lê o arquivo GIF */
$im = new Imagick("exemplo.gif");

/* Redimensiona todos os quadros */
foreach ($im as $frame) {
/* quadros de 50x50 */
$frame->thumbnailImage(50, 50);

/* Define a tela virtual para o tamanho correto */
$frame->setImagePage(50, 50, 0, 0);
}

/* Observe que a função writeImages é usada no lugar de writeImage */
$im->writeImages("example_small.gif", true);
?>

Trabalhando com a primitiva de elipse e fontes customizadas

Exemplo #6 Criando a logomarca do PHP

<?php
/* Define largura e altura na proporção da logomarca genuína do PHP */
$width = 400;
$height = 210;

/* Cria um objeto Imagick com tela transparente */
$img = new Imagick();
$img->newImage($width, $height, new ImagickPixel('transparent'));

/* Nova instância de ImagickDraw para desenhar a elipse */
$draw = new ImagickDraw();
/* Define cor de preenchimento roxa para a elipse */
$draw->setFillColor('#777bb4');
/* Define as dimensões da elipse */
$draw->ellipse($width / 2, $height / 2, $width / 2, $height / 2, 0, 360);
/* Desenha a elipse na tela */
$img->drawImage($draw);

/* Redefine a cor de preenchimento de roxa para preta para o texto (nota: reutilizando o objeto ImagickDraw) */
$draw->setFillColor('black');
/* Define a borda para a cor branca */
$draw->setStrokeColor('white');
/* Define a espessura da borda */
$draw->setStrokeWidth(2);
/* Define o espaçamento da fonte (valor negativo significa que as letras ficam mais próximas uma da outra) */
$draw->setTextKerning(-8);
/* Define a fonte e o tamanho usados na logomarca do PHP */
$draw->setFont('Handel Gothic.ttf');
$draw->setFontSize(150);
/* Centra o texto horizontalmente e verticalmente */
$draw->setGravity(Imagick::GRAVITY_CENTER);

/* Adiciona o texto central "php" com deslocamento Y de -10 na tela (dentro da elipse) */
$img->annotateImage($draw, 0, -10, 0, 'php');
$img->setImageFormat('png');

/* Define o cabeçalho adequado para PNG e mostra a imagem */
header('Content-Type: image/png');
echo
$img;
?>

O exemplo acima produzirá algo semelhante a:

Saída do exemplo : Criando a logomarca do PHP com Imagick

adicione uma nota

Notas Enviadas por Usuários (em inglês) 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
10 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