Marca D'agua em imagens com PHP

  • Autor do post:
  • Categoria do post:PHP DEV

Utilizando o PHP para inserir uma marca d’agua em suas imagens

Atualizado:  http://clares.com.br/2012/11/07/gerar-miniatura-php-adicionando-marca-dagua-nas-imagens/

Galera nesse post mostrarei como colocar marca d’agua em imagens de forma dinâmica, ou seja, sem editar as imagens. Criaremos uma pequena aplicação que irá mesclar 2 imagens onde uma será a foto que queremos mostrar e a segunda imagem será a marca d’agua. Faremos com o PHP, então é importante que em seu PHP esteja instalada e ativa a biblioteca GD/GD2. Se você tiver dificuldades para instalar bibliotecas aconselho utilizar o EasyPHP que possui um gerenciador bem simples para ativar a biblioteca no php.

easyphp

A finalidade é criar dinâmicamente uma galeria com fotos utilizando a marca d’agua sem precisar editar imagem por imagem, dessa forma você preserva/restringe o uso dos direitos das imagens do site. Assim se copiarem a foto do site será copiada com sua marca.

Vejamos o arquivo index.php (ou html)

<html>
<head>
<title>:: Marca D’agua ::</title>
</head>
<body>
<img src=”images/foto2.jpg width=”300” height=”250>
<img src=”water.php?img=foto2>
</body>
</html>

Perceba que as linhas inserem as imagens são diferentes, isso porque a primeira linha está inserindo comumente a foto do exemplo, já na segunda linha perceba que não estamos passando uma imagem na tag src e sim uma url. O arquivo water.php recebe por metodo get o caminho da foto, neste caso do exemplo o caminho da foto está atribuido à variável img, ou seja img=foto2 indica que o caminho da foto é no mesmo diretório, poderia e até mesmo deveria ser passando o caminho da pasta imagens, mas para não causar uma impressão de “muito código para pouca coisa” eu preferi colocar no mesmo diretório, porém aconselho que façam dessa forma:
< img src=”water.php?img=albuns/1/foto01″ alt=”foto” >
Quero dizer com isso que estruturem os diretórios do seu site/sistema ok !

Passamos então para o arquivo water.php

<?php
#variavel que recebe a url/caminho da imagem
$filename = “images/”.$_GET[‘img’].”.jpg”;
header(‘Content-type: image/jpeg’);

#dados da mascara [caminho do arquivo que serve de mascara]
$marca =  “images/mascara.gif”;
$imagem_marca =   ImageCreateFromGif($marca);
$pontoX1 =   ImagesX($imagem_marca);
$pontoY1 =   ImagesY($imagem_marca);

#recupera as dimensoes da imagem
list($width, $height) = getimagesize($filename);

#definindo tamanho padrão para as fotos
$new_width = 300;
$new_height = 250;

#redesenhando a imagem
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

#Habilitando a opcao abaixo irá criar a mascara com a imagem marca d’agua
ImageCopyMerge($image_p, $imagem_marca, 160, 90, 0, 0, $pontoX1, $pontoY1, 80);

imagejpeg($image_p, null, 100);
imagedestroy($image_p);
?>

Acredito que os comentários no arquivo PHP já dê uma noção do que e como é feita essa junção das imagens.

Na linha:

imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

Estamos reconstruindo a imagem que foi passada por get na url (img=foto2)

Na linha:

ImageCopyMerge($image_p, $imagem_marca, 160, 90, 0, 0, $pontoX1, $pontoY1, 80);

O 3º parâmetro (160) é a distância em pixel da esquerda, o 4º parâmetro (90) é a distância em pixel do topo da foto/imagem e também é a posição em que será inserida a imagem que corresponde à marca d’agua, o último parâmetro (80) trata-se da transparência, quanto menor o número mais transparencia terá a imagem da marca d’agua, no caso a .gif atribuida à variável $marca no arquivo php.

No geral o que acontece é que as imagens são mescladas pelo arquivo PHP, então crie uma imagem .gif que servirá de marca d’agua e altere a variável $marca no arquivo PHP.

Veja a imagem sem a marca

Veja como fica no final c/ a marca

Veja outros exemplos

Para adiantar algumas eventuais perguntas que possam surgir, as funções do arquivo .php referem-se, como podem ver, à imagens .jpg. Existem as funções  apropriadas para cada tipo de imagem, seja .png , .gif ….

Veja todas as funções para tratar imagens no manual php.

Abraços,

Rafael Clares

Este post tem 34 comentários

  1. alexestudos

    Muito legal o post,
    é justamente o que estava procurando.

    Obrigado

  2. Léoton

    Mano num fungo aki!
    ele apenas mostrar a foto q num vem pela GET

  3. Rafael Clares

    Leoton, poste o código e o endereço das imagens, senão ficará muito difícil te ajudar. até logo

  4. Léoton

    CAra na ral num entendi o quer vcer dizer com essa liha
    $marca = “images/mascara.gif”;
    esse gif é o script é q cria esse arquivo?

  5. Rafael Clares

    Leoton, Se você ler denovo post verá o comentário dizendo que é preciso haver uma imagem que servira como a marca d’agua, essa linha que você não entendeu é o caminho do arquivo .gif que será mesclado com todas as fotos. Nesse exemplo essa imagem é que que aparece na frente dos carros “clares autos” é uma gif jogada por cima das imagens. Leia novamente por favor. abraços

  6. Léoton

    tá blz…
    entao isso vc upa duas imagens…
    mas só faz a mascara em uma só q vc passa pela get…
    certo?

  7. Rafael Clares

    isso mesmo, a imagem usada para a máscara é uma imagem prédefinida(neste caso) ou seja fixa. Mas nada impede que você informe por GET as 2 imagens tanto a mascara quanto a imagem a que se quer aplicar a mascara. abraços

  8. Junior

    Muito bom, pra quem está procurando um GD que dê qualidade na foto esté é o perfeito, muito obrigado, a internet precisa de gente como vc , não de designers egositas como muitos outros, valeuuuu

    1. Rafael Clares

      Junior, muito obrigado pelo comentário.
      Fico feliz que tenha gostado.

      abraços

  9. Geena

    Muito obrigado pelo tutorial, Rafael. Com algumas pequenas adaptações encaixou perfeitamente no código que eu estou usando e está suficientemente bem expicado.

    1. Rafael Clares

      Oi Geena, grato pelo comentário.
      Até logo,

  10. Rogerio

    Muito bom…
    Procurava isso a tempo.

  11. Rafael

    Bom, sou novo em php, gostaria de saber se pode me indicar mias informações, pois não consegui fazer.

    Obrigado.

    1. Rafael Clares

      Rafael, preciso ao menos que você me diga o que está acontecendo.
      até logo

  12. Andre Freitas

    Oi rafael! Eu estava procurando isto msm mais não consegui fazer não! :/ Estou iniciando php tenhu aki um upload de foto mais sem a logomarca.E queria que todas as fotos upadas de uma pasta saiam com a minha logo.Agradeço!se puder me ajudar eu lhe agradeço msn= [email protected]

    1. Rafael Clares

      André, preciso ao menos que você me diga o que está acontecendo.
      até logo

  13. Thiago Rafael

    Olá rafael
    muito obrigado por seu tutorial
    está bem explicado e fácil de implementar

    mas vai uma dica para os q testaram e ñ conseguiram

    eu tbm ñ estava conseguindo fazer funcionar
    o problema foi q quando copiei o código da página
    e colei no editor de código q to usando

    as aspas ñ foram reconhecidas como separadores
    então tive q digitá-las
    e pronto funcionou q eh uma beleza
    hehehe

    Abs

  14. Thiago Rafael

    Olá novamente
    rafael vc pode me da uma ajudinha com imagem PNG
    bom eu fui no manual e modifique a linha:
    $imagem_marca = ImageCreateFromGif($marca);

    e coloquei:
    $imagem_marca = imagecreatefrompng($marca);

    funcionou e tal
    so q a transparência da imagem png n ficou legal
    veja
    http://www.thgcivic.0fees.net/galeria/

    Abs

    1. Rafael Clares

      Thiago, dá uma olhada em php.net/imagecreatefrompng … abraços

  15. Kadu Dutra

    tem como fazer, mais sem alterar o tamanho da imagem ?

    1. Rafael Clares

      Tem, basta alterar as linhas:
      $new_width = 300;
      $new_height = 250;

      Para:
      $new_width = $width;
      $new_height = $height;

  16. Miller Martins

    Olá Rafael, bom dia.
    Rapaz eu consegui fazer essa marca d’agua normal, mas só que a imagem fica muito sem qualidade, tanto a imagem normal quanto a logomarca.gif.
    Ver aí o meu exemplo neste link;
    http://www.antonioalmeidanews.com/water3.php?img=120361312.jpg
    Tem como a gente colocar qualidade nas imagens sem que ela fique muito pesada?
    ..
    E só mais uma coisinha, sobre as imagens .png e .gif não aceitam receber a logomarca, elas ficam preta e não aparecem. Como eu faço pro arquivo water.php aceitar todas as extensões de imagens?
    Eu procurei muito neste arquivo php.net mas eu não encontrei essa parte das extensões, eu achei umas coisa falando a respeito mas não me ajudou muito pois eu não soube fazer a alteração para o arquivo water.php aceitar todas elas.
    Por favor, me ajuda, eu fico aguardando a sua resposta.
    Um abraço!

  17. Bruno

    http://www.multi.com.br/
    Preciso fazer um box igual a desse site destaques de locação.
    dinamico que apareca a foto e a descricao em cima da mascara teria como me ajudar?

  18. Alberto

    BOA TARDE RAFAEL,
    GOSTARIA DE SABER A POSSIBILIDADE DE APLICAR ESSA MARCA D’AGUA NA GALERIA DINAMICA QUE VOCÊ DISPONIBILIZA AQUI NO SITE?

    1. Rafael Clares

      Alberto, você precisa ler os 2 posts e entender o mínimo de PHP para fazer isso!

      1. Dhyego Andre

        Boa Tarde, Gostaria de saber o seguinte, eu estou usando Shadowbox.
        Com thumb, mas queria usar o water para quando abrir o shadowbox.

        <a href="water.php?galeria/grandes/” rel=”shadowbox[Vacation]” >

        <img src="thumb.php? img=galeria/miniaturas/” id=”photo_compagny” />

        ——–
        Alguem poderia me ajudar não sei que estou fazendo de errado….

        E parabéns pelos posts, o Thumb peguei aqui tbm =D

        1. Rafael Clares

          Oi está faltando o arquivo em href=”water.php?galeria/grandes/”
          creio que seria algo como href=”water.php?galeria/grandes/foo.jpg”

  19. R3X

    Parabéns pelo código amigo, me ajudou bastante.

  20. José Maicon Miranda

    Oi cara,
    quês quanto pra me ajudar.
    se pedir não podes me ajudar.
    e quando posto algo você recusa.

    1. Rafael Clares

      Amigo, não cobro para ajudar!
      Não recuso nenhum comentário, acontece que eles precisam ser moderados e eu, infelizmente, não fico o dia inteiro no blog, ele não me dá nenhum retorno financeiro.
      Então, a cada 7, 10 ou 15 dias eu entro aqui e tento responder tudo. Infelizmente, nem sempre eu consigo deixar todo mundo feliz ou resolver tudo.

  21. paulo robson

    Poxa valeu mesmo Rafael Clares, funcionou aqui 100%

    Deus te abençoe

Os comentários estão encerrados.