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!

Secção imagick no php_info

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.

Devem existir outros hosters que forneçam esta extensão de raiz, mas eu só conheço um, este onde está alojado o DreamsInCode, 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 ‘Net, é 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:

Castelo de Guimarães

Redimensionar para uma largura máxima.

imageThumbnail

// 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.

imageThumbnail

$img->cropThumbnailImage(150, 150);

Aplicar um sharpen à imagem (útil no caso dos thumbnails, para ficarem mais nítidos – reparem na diferença para a anterior).

imageThumbnail

$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.

imageThumbnail

$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 PNG’s 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 aqui 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, o visita com o IE6 e tomar medidas apropriadas – se for um percentagem considerável, não será boa ideia tornar o site mais lento para eles. Mas voltaremos a esses hacks posteriormente.

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):

imageThumbnail

Partilhar no Sapo Links Partilhar no del.icio.us Partilhar no Digg Partilhar no Twitter Partilhar no StumbleUpon Partilhar no MySpace Partilhar no Facebook

Comentários Deixar um comentário

 Categorias
 Arquivo
 Projectos em Destaque
 Últimas Postas no Blog
 Últimos Comentários do Blog