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?
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):
Redimensionar para uma largura máxima.
// 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.
$img->cropThumbnailImage(150, 100);
Aplicar um sharpen à imagem.
Ú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.
$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):