Exemplo efeito espelho com Imagick

Analisamos um exemplo um pouco mais complexo, efeito de espelho em uma imagem, para estudar a utilização de Imagick em PHP.

Por Sara Alvarez Langa


Publicado em: 16/12/13
Valorize este artigo:

Já conhecemos o funcionamento de Imagick, e por essa razão vamos realizar um exemplo um pouco mais complexo, para já no próximo artigo trabalhar com algum outro exemplo real sobre PHP. O exemplo de hoje consiste em criar um reflexo para uma imagem que carregamos em um canvas . Em seguida giramos a imagem e colocamos uma camada com um degradé para torná-lo algo menos opaco.

Vamos começar a ver as linhas de código:

Criamos o objeto com a imagem à que queremos fazer o reflexo.


$im= new Imagick("imagem.png");

Criamos uma miniatura adequada ao tamanho que queremos mostrar. Já vimos como é feito anteriormente.


$im->thumbnailImage(200, null);

Clonamos a imagem para poder girá-la e posicioná-la sobre a original


$reflexo = $im->clone();
$reflexo->flipImage();

Agora o que vamos fazer é criar o gradiente para colocá-lo sobre a imagem clonada. Para isso geramos um canvas vazio .


$gradiente = new Imagick();

Para que tudo fique bem, o degradé transparente tem que ser maior do que a imagem.


$gradiente->newPseudoImage($reflexo->getImageWidth() + 5, $reflexo->getImageHeight() + 5, "gradient:transparent-black");

O passo seguinte é colocar o degradé sobre o reflexo e compor a nova camada com ambos.


$reflexo->compositeImage($gradiente, imagick::COMPOSITE_OVER, 0, 0);

Como complemento podemos acrescentar algo mais de opacidade ao reflexo:


$reflexo->setImageOpacity(0,2);

Com isto já temos o reflexo criado, agora nos falta colocá-lo na imagem original para inserir a imagem desejada com o reflexo.

É importante lembrar que vamos colocar ambas as imagens (original e reflexo), de modo que devemos criar um canvas maior do que a da imagem original.


$altura= ($im->gegImageHeight() * 2 )+10;
$largura = $im->getImageWidth() +10;

$canvas->newImage($largura, $altura, new ImagickPixel("black"));
$canvas->setImageFormat("png");

$canvas-> compositeImage ($im, imagick::COMPOSITE_OVER, 5, 5);
$canvas-> compositeImage ($reflexo, imagick::COMPOSITE_OVER, 5, $im->getImageHeight() + 5);

Com isto já temos nosso reflexo criado e só nos faltaria, então, mostrá-lo na nossa web, subi-lo para a nossa pasta, imprimi-lo ou o que queiramos fazer com ele.

Para nosso artigo o que vamos fazer é mostrá-lo diretamente na tela.


Header("Content-Type: image/png");
echo $canvas;

Para terminar, deixo todo o código completo e o resultado obtido ao realizá-lo:

Imagem inicial:



$im = new Imagick("imagemoriginal.png");

$im->thumbnailImage(200, null);

$reflexo = $im->clone();
$reflexo->flipImage();

$gradiente = new Imagick();

$gradiente->newPseudoImage($reflexo->getImageWidth() + 5, $reflexo->getImageHeight() + 5, "gradient:transparent-black");

$reflexo->compositeImage($gradiente, imagick::COMPOSITE_OVER, 0, 0);

$reflexo->setImageOpacity( 0.2 );

$canvas = new Imagick();

$altura = ($im->getImageHeight() * 2) + 10;
$largura = $im->getImageWidth() + 10;
$canvas->newImage($largura, $altura, new ImagickPixel("black"));
$canvas->setImageFormat("gif");

$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 5, 5);
$canvas->compositeImage($reflexo, imagick::COMPOSITE_OVER, 5, $im->getImageHeight() + 5);

header("Content-Type: image/png");
echo $canvas;






Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato