Marca d’água em tempo de execução em PHP
por Nivali

Precisando proteger suas imagens de cópias indevidas? A melhor solução é adicionar uma marca d’água em suas imagens. Esse script mostra como se realiza essa tarefa usando PHP e a biblioteca GD.



Embora tenha visto alguns scripts e algumas FAQs respondendo sobre isso aqui no PHPBrasil, nenhum artigo foi publicado. Esse artigo é extremamente básico e o publico apenas porque recentemente alguém me pediu como fazer isso eu resolvi aproveitar o esforço para talvez ajudar outra pessoa. Eu ia publicar no meu blog, mas para maior visibilidade o coloco aqui. Implementar isso na mão nem é realmente necessário pois existem vários scripts aqui no PHPBrasil para fazer essa tarefa.

Esse artigo é baseado no artigo Watermark Images on the Fly in PHP (http://www.sitepoint.com/article/watermark-images-php) de Brock Ferguson.

----------------------------------------------------

Precisando proteger suas imagens de cópias indevidas? A melhor (para não dizer única) solução é adicionar uma marca d’água em suas imagens. Mas aplicar a marca usando um editor de imagens custa tempo e é totalmente dispensável já que o PHP pode fazer isso para você.

Para esse artigo o servidor precisa ter o PHP4 ou superior e a biblioteca GD 2.0 ou superior. Será mostrado algo sobre a GD e as funções básicas para construir uma marca d’água em tempo de execução.

O Script

O script tem apenas 13 linhas e inicia com um header() para dizer ao browser que você vai mostrar uma imagem no formato JPEG. Com essa linha a página irá chamar o script pela tag <img> mostrando a imagem. Declarar o tipo de arquivo (no caso JPEG) é necessário porque o tipo padrão dos scripts PHP é "text/html".


<?php
header
('content-type: image/jpeg');
?>


A marca d’água

Usaremos um arquivo chamado 'marcadagua.png' que é colocado no mesmo diretório do script. O arquivo deve ser um PNG-8 e não um PNG-24 pois existe um bug na GD e faz o formato PNG-24 não ser usado corretamente.


<?php
$watermark 
imagecreatefrompng('marcadagua.png');
?>


Usamos as funções do PHP imagesx() e imagesy() para pegar a largura e o comprimento da imagem respectivamente.


<?php
$watermark_width 
imagesx($watermark);  
$watermark_height imagesy($watermark);
?>




Esse script gera a imagem a partir de uma imagem com o nome enviado via GET. Está sendo assumido que a imagem será em formato JPEG por isso a utilização da função PHP imagecreatefromjpeg().


<?php
$image 
imagecreatefromjpeg($_GET['src']);
?>


Você pode tratar para outros formatos de imagens e até outras formas de envio de imagem, mas isso não é o escopo dessa explicação.

Em seguida será feito cálculos de dimensão da imagem que será colocada a marca. Fazemos uso da função getimagesize() que trabalha retornando um array onde o índice "0" = largura e índice "1" = algura.

O procedimento das próximas três linhas de código são: pegar as dimensões imagem que será marcada ($image); subtrair a dimensão correspondente da imagem que é a marca d’água e adicionar 5 pixels na margem.


<?php
$size 
getimagesize($_GET['src']);  
$dest_x $size[0] - $watermark_width 5;  
$dest_y $size[1] - $watermark_height 5;
?>


Juntando a imagem com a marca d’água

Aqui é a função mais complexa do script: imagecopymerge (). A sintaxe oficial para esta função é:


int imagecopymerge ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct )


Você pode ver mais sobre essa função no manual do PHP usando o link http://www.php.net/manual/pt_BR/function.imagecopymerge.php que lhe leva para a versão em português. Em resumo, a linha seguinte de código funde as duas imagens que usam os locais de destino que nós calculamos anteriormente:

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);

Nas linhas finais de código teremos a imagem fundida com a marca d’água como uma imagem JPEG. Usaremos a função imagedestroy() para liberar a memória de todos a imagens carregadas anteriormente com a biblioteca GD.


<?php
imagejpeg
($image);  
imagedestroy($image);  
imagedestroy($watermark);
?>


Agora você pode adicionar a marca d’água em qualquer imagem no seu servidor.



O código completo ficou assim:


<?php  
header
('content-type: image/jpeg');  

$watermark imagecreatefrompng('marcadagua.png');  
$watermark_width imagesx($watermark);  
$watermark_height imagesy($watermark);  
$image imagecreatetruecolor($watermark_width$watermark_height);  
$image imagecreatefromjpeg($_GET['src']);  
$size getimagesize($_GET['src']);  
$dest_x $size[0] - $watermark_width 5;  
$dest_y $size[1] - $watermark_height 5;  
imagecopymerge($image$watermark$dest_x$dest_y00$watermark_width$watermark_height100);  
imagejpeg($image);  
imagedestroy($image);  
imagedestroy($watermark);  
?>


Espero que isso ajude alguem!