Esta é uma versão antiga do documento!
Tabela de Conteúdos
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.
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 ‘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: http://www.dreamsincode.com/_media/img/2010/03/imagick_sample_1.JPG
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 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):
Créditos
Autor: mjamado
Fonte: DreamsInCode