|
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_y, 0, 0, $watermark_width, $watermark_height, 100);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
?>
|
Espero que isso ajude alguem!
|
|
|