Ir para o conteúdo

Imagick

O que é?

A extensão Imagick é uma extensão para PHP para criação e modificação de imagens, que usa a API ImageMagick. Está disponível através do PECL ou, apenas para Windows, no site do seu criador, Mikko Koppanen. A API ImageMagick, que é de instalação obrigatória, está disponível no site oficial, para vários sistemas operativos.

Em relação à extensão GD2, bastante comum, o Imagick é mais rápido nalgumas das operações mais comuns: redimensionamentos, filtro sharpen, rotações, cortes, etc. Além disso, tal como está no nome, aplica alguma magia nalgumas operações: sombreados, cantos arredondados, composição de texto e imagem... Apesar de nada disto ser inacessível à extensão GD2, no Imagick será possível fazer a maior parte destas operações em poucas linhas — nalgumas operações, apenas uma linha!

Como verificar se um servidor de produção tem o Imagick instalado?

PHP info: secção imagick

Na realidade, são precisas duas coisas, tal como já disse anteriormente: a API ImageMagick e a extensão Imagick. A forma mais fácil de visualizar é via instrução php_info(). Basta colocar esta instrução num ficheiro .php e executá-lo. De todas as informações que aparecem, deverá existir uma secção imagick, semelhante à apresentada à esquerda (clicar para maior).

Devem existir outros hosters que forneçam esta extensão de raiz, mas eu só conheço um, a Hocnet. Noutros hosters, que não tenham o serviço instalado, é pedir com jeitinho. Penso que não haja nenhum que recuse. Como é lógico, aconselho fortemente a Hocnet: ao menos, já estão habituados a esta extensão e não vão fazer disparates por ignorância.

Está instalado e pronto a usar, e agora?

Agora, é só usar. Criar um objecto Imagick é do mais linear possível, com uma pequena ressalva: dependendo das versões, a classe poderá ser imagick ou Imagick, o que pode levar a algum desespero ao início. Depois de se descobrir qual é, siga para bingo:

// é conveniente que o caminho para a imagem seja qualificado,
// isto é, desde a raiz do servidor
$img = new imagick($caminho_imagem);

Se quiserem criar uma imagem a partir de outro servidor na internet, é preciso usar um método específico para ler o ficheiro a partir duma chamada curl (verificar no php_info se a extensão curl está instalada, também), em vez de o abrir localmente:

$ch = curl_init($url_imagem);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// reparem na instanciação sem caminho
$img = new imagick();
// vamos executar a chamada curl, para dentro do objecto imagick
$img->readImageBlob(curl_exec($ch));

curl_close($ch);

Para enviar a imagem para o browser, é só indicar os headers correctos e fazer echo do próprio objecto:

// o Content-Type há-de variar, conforme o tipo de imagem
header("Content-Type: image/jpeg");
echo($img);

Agora, é mesmo aplicar a magia... Abaixo estão alguns casos comuns, código e imagens. A imagem usada é do Castelo de Guimarães, tinha originalmente 10 MPixels, mas foi redimensionada localmente para 1024x768, e é a seguinte (clicar para maior):

Imagick: exemplo

Redimensionar para uma largura máxima.

Imagick: exemplo thumbnail

// reparem como não estou a definir uma altura
$img->thumbnailImage(150, 0);

Redimensionar para um tamanho definido, sem distorcer, cortando zonas que estejam a mais.

Imagick: exemplo

$img->cropThumbnailImage(150, 100);

Aplicar um sharpen à imagem.

Imagick: exemplo

Útil no caso dos thumbnails, para ficarem mais nítidos – reparem na diferença para a anterior

$img->cropThumbnailImage(150, 150);
// o primeiro parâmetro é o raio e o 
// segundo é o desvio - é ir experimentando
$img->sharpenImage(4, 2);

Agora, algo mais pintas, arredondar os cantos.

Imagick: exemplo com cantos redondos

$img->roundCorners(10, 10);

// aqui é preciso mais alguma coisa:
// como arredondar os cantos "mostra" o fundo,
// a imagem tem transparência; como tal, é
// necessário:

// 1. mostrá-la num formato com
// transparência (não esquecer de ajustar depois
// os headers necessários)
$img->setImageFormat("png");

// 2. aplicar um fundo sólido (ou não)
$fundo = new imagick();
// criar nova imagem
$fundo->newImage($img->getImageWidth(),  // largura da imagem original
                 $img->getImageHeight(), // altura da imagem original
                 "#FFFFFF",              // cor de fundo
                 "jpg"                   // formato da imagem
                );
// compôr a imagem original sobre o novo fundo
$img = $fundo->compositeImage($img,                     // compôr o quê
                              imagick::COMPOSITE_OVER,  // como
                              0, 0                      // e onde
                             );

Esta última metodologia pode parecer um bocadinho over the edge, mas é necessária para aqueles 10% que ainda usam o IE6 – não suporta PNGs transparentes. A boa notícia, é que existem outras técnicas; a má, é que dependem de Javascript e de hacks específicos para IE6, com uma penalidade na performance assinalável. É o que eu uso no DreamsInCode, mas apenas porque é um site pessoal e eu quero que esses 10% troquem é de browser... Num site comercial, é preciso estudar bem que percentagem, ao certo, de visitas com o IE6 e tomar medidas apropriadas — se for uma percentagem considerável, não será boa ideia tornar o site mais lento para eles. Mas voltaremos a esses hacks posteriormente.

Próximos passos

Por hoje, ficamos por aqui. Noutro dia explicarei algumas funções mais avançadas, como sombreados, composição de texto, composição de outras imagens sobre a imagem original, etc. Por ora, deixo-vos com este exemplo all-in (sim, a imagem ainda é a mesma, é tudo feito com o Imagick):

Imagick: exemplo com múltiplas transformações