Tutorial: Marca d’água em imagens com PHP

By Plínio Torres

Como o meu negócio é desenvolvimento web mesmo, não adianta fugir, o negócio é aproveitar a tecnologia! Muitos sites de fotos usam este recurso como um modo de colocar o logotipo do site ou da empresa em fotos postadas na internet de modo a identificar a foto onde quer que ela seja usada. Repare que ficaria mais ou menos assim:

marca.jpg

Um monte de nego tonto segurando uma garrafa? Não! Preste atenção na marca d’água, o logotipo do site em questão embaixo na foto.

Ai o cara tira aquele monte de foto e no dia seguinte com aquele sono e aquela ressaca do caralho vai pra frente do micro postar as imagens no site e fica horas no Photoshop colocando a marca d’água em cada foto, uma a uma. Como diria Seu Creisson, isso é coisia do passadio quando se usia a tecnlogistica modernia!

Vou ensinar aqui passo a passo um script que fiz pra um site de fotos da região que coloca automaticamente a marca nas fotos, conforme elas vão sendo postadas no site em questão, sem precisar manipular nada em um editor de imagens.

Para criar a marca é necessário que haja a biblioteca de manipulação de imagens GD instalada no servidor web, caso não possua, procure no Google como instalar.

Vamos definir a marca que será usada:
logo-php.jpg
Logotipo do nosso poderoso php!

Vamos definir a imagem onde a marca será aplicada:
foto_da_marca.jpg

Lembrando que este script só trabalha com imagens no formato JPG ou PNG!

Agora vamos ao script:

<?php
// Definido parâmetros como o endereço das imagens, a posição da marca na imagem, a porcentagem de transparência da marca e onde a marca pronta será armazenada

$foto = “http://200.131.250.31/plinio/blog/foto_da_marca.jpg”;
$marca=”http://200.131.250.31/plinio/blog/logo-php.jpg”;
// Rodapé direito, veja os números correspondentes na função
$posicao=”3″;
// Porcentagem de transparência desejada na marca
$transparencia=”60″;
// Local onde a imagem pronta será armazenada
$saida=”galeria/resultado.jpg”;

class marca_dagua
{
// Construtor, verifica se a biblioteca GD tá no sistema

function marca_dagua()
{
// Verifica se há biblioteca GD no PHP
if(!function_exists(”ImageCreateTrueColor”)) // GD versão 2.*
{
if(!function_exists(”ImageCreate”)) // GD versão 1.*
{
echo “Você não possui a biblioteca GD carregada no PHP!”;
exit;
}
}
}
// Começamos a criar a marca com a função Gera
function gera($imagemfonte, $marcadagua, $imagemdestino, $pos = 0, $transicao = 100)
{
// Obtém o cabeçalho de ambas as imagens
$funcao = $this->verifica_tipo($marcadagua, “abrir”);
$marcadagua_id = $funcao($marcadagua);
$funcao = $this->verifica_tipo($imagemfonte, “abrir”);
$imagemfonte_id = $funcao($imagemfonte);

// Obtém os tamanhos de ambas as imagens
$imagemfonte_data = getimagesize($imagemfonte);
$marcadagua_data = getimagesize($marcadagua);
$imagemfonte_largura = $imagemfonte_data[0];
$imagemfonte_altura = $imagemfonte_data[1];
$marcadagua_largura = $marcadagua_data[0];
$marcadagua_altura = $marcadagua_data[1];

// Aqui, defini-se a posição onde a marca deve aparecer na foto

// Centralizado
if( $pos == 0 )
{
$dest_x = ( $imagemfonte_largura / 2 ) – ( $marcadagua_largura / 2 );
$dest_y = ( $imagemfonte_altura / 2 ) – ( $marcadagua_altura / 2 );
}

// Topo Esquerdo
if( $pos == 1 )
{
$dest_x = 0;
$dest_y = 0;
}

// Topo Direito
if( $pos == 2 )
{
$dest_x = $imagemfonte_largura – $marcadagua_largura;
$dest_y = 0;
}

// Rodapé Direito
if( $pos == 3 )
{
$dest_x = ($imagemfonte_largura – $marcadagua_largura) – 5;
$dest_y = ($imagemfonte_altura – $marcadagua_altura) – 5;
}

// Rodapé Esquerdo
if( $pos == 4 )
{
$dest_x = 0;
$dest_y = $imagemfonte_altura – $marcadagua_altura;
}

// Topo Centralizado
if( $pos == 5 )
{
$dest_x = ( ( $imagemfonte_largura – $marcadagua_largura ) / 2 );
$dest_y = 0;
}

// Centro Direito
if( $pos == 6 )
{
$dest_x = $imagemfonte_largura – $marcadagua_largura;
$dest_y = ( $imagemfonte_altura / 2 ) – ( $marcadagua_altura / 2 );
}

// Rodapé Centralizado
if( $pos == 7 )
{
$dest_x = ( ( $imagemfonte_largura – $marcadagua_largura ) / 2 );
$dest_y = $imagemfonte_altura – $marcadagua_altura;
}

// Centro Esquerdo
if( $pos == 8 )
{
$dest_x = 0;
$dest_y = ( $imagemfonte_altura / 2 ) – ( $marcadagua_altura / 2 );
}
// A função principal: misturar as duas imagens
imageCopyMerge($imagemfonte_id, $marcadagua_id, $dest_x, $dest_y, 0, 0, $marcadagua_largura, $marcadagua_altura, $transicao);

// Cria a imagem com a marca da agua
$funcao = $this->verifica_tipo($imagemdestino, “salvar”);
$funcao($imagemfonte_id, $imagemdestino, 100);
}

// Verifica o tipo da imagem e retorna a função para uso
function verifica_tipo($nome, $acao)
{
if(eregi(”^(.*)\.(jpeg|jpg)$”, $nome))
{
if($acao == “abrir”)
{
return “imageCreateFromJPEG”;
}
else
{
return “imagejpeg”;
}
}
elseif(eregi(”^(.*)\.(png)$”, $nome))
{
if($acao == “abrir”)
{
return “imageCreateFromPNG”;
}
else
{
return “imagepng”;
}
}
else
{
echo “Formato de Imagem Inválido!<br>A imagem deve ser PNG ou JPEG!”;
die;
}
}
}
// Chama a função de nova imagem a ser criada
$imagem =& new marca_dagua();

// Cria a imagem de acordo com as imagens fonte, posição e transparência
$imagem->gera(”$foto”, “$marca”, “$saida”, $posicao, $transparencia);

// Imprime a imagem final com a marca, com o nome de resultado.jpg
echo “<img src=\”$saida\” border=0>”;
?>

Pronto! Eis ai o resultado do nosso script:
resultado.jpg

Fácil não? É um script muito útil e fácil de implementar…
PHP comanda, hehehe! Até a próxima!

54 Respostas para “Tutorial: Marca d’água em imagens com PHP”

  1. DEIMONN Disse:

    BOA TARDE

    MEU ACABO DE CONHEÇER SUA PHP E GOSTEI MUITO DA SUA CRITICA E CONCORDO COM VC.

    GOSTARIA DE PARTILHAR ALGUMAS DAS MINHAS INDIGNAÇÕES PELA FALATA DE RECURSOS E A DIFICULDADE DE ACESSO DA INFORMÁTICA AQUI NO BRASIL.

    ACHE BACANA ESTA DICA PARA A MARCA DÁGUA NÃO EXECUTEI AIDNA MAS COM CERTEZA VOU E VOLTO AQUI PARA COMENTAR

    ATT. DEIMONN ADD MSN

    ABÇ

  2. Cássius Lemes Disse:

    Perfeito amigo, só tem um errinho no final , trocasse o nome da variável $pos por $posicao , o resto está perfeito. Abraços

  3. Cássius Lemes Disse:

    Opa, erro meu, está perfeito, a variável $posicao foi incrementada la no começo! Abraços

  4. Glayson Santos Disse:

    Muito bom esse tuto, aliás, muito bom todos de php desse blog, continue assim, abraços.

  5. Eduardo de Oliveira Disse:

    Cara, queri colocar um texto como marca dágua, alguma dica?

    Valeu…

  6. Clara Disse:

    Parabéns!
    O problema é que tenho 73 anos e não consigo entender onde vão todos esses códigos.
    Meu php 7.0 vem com uma droga de digimarc que não funciona como eu queria. Nem consigo entender onde ele coloca(embute) a marca.
    Vc me ajuda?
    Se puder manda um email?
    deus abençoe
    clara

  7. Antibush Disse:

    Bush is forever saying that democracies do not invade other countries and start wars. Well, he did just that. He invaded Iraq, started a war, and killed people. What do you think? Is killing thousands of innocent civilians okay when you are doing a little government makeover?
    If ever there was ever a time in our nation’s history that called for a change, this is it!
    The more people that the government puts in jails, the safer we are told to think we are. The real terrorists are wherever they are, but they aren’t living in a country with bars on the windows. We are.

  8. Danilo Akamine Disse:

    Muito bom. Parabéns

  9. LumaKimura.net [ Blog ] » Blog da Vez: Plínio Torres Disse:

    [...] dia desses por dicas e macetes para melhorar alguns scripts para inserir marca d’águas em imagens com o PHP encontrei o blog do Plínio Torres, visual limpo e bem organizado, linguagem clara e bem humorada, [...]

  10. Ale Disse:

    Eu estou procurando um sistema em que o usuário envia uma imagem do computador dele e a imagem além de ficar com uma marca dágua ela é optimizada ( para ficar com um peso menor ) e se possível redimensioná-la para um tamanho máximo.
    Igual o site do flogão.
    Uma pessoa envia uma imagem, ela é optimizada e fica com o nome do endereço do flog.
    Alguém tem algum script completo ou parcial do que eu preciso?

  11. Leonardo Gazio Disse:

    Pô amigão, teu script pode até tá funcionando, só que ele tá muito enrolado, o que desanima de tentar fazer funcionar, aí vocês vêm dizer “Ahh, mas isso aí é pra estudo, tem que bater cabeça mesmo”, mas isso não é o que a maioria pensa, pois quando a gente chega a procurar no google, é porque a gente tá esperando achar uma solução pra mais um dos problemas e não pra achar mais dor de cabeça…

  12. Rodrigo Nani Disse:

    Google é google mesmo! Eu procurando isto na NET e olha onde vim parar! Ficou 10 teu site! Agora vou testar seu script… o único problema inicial que vejo nele é de você ser FRAMENGUISTA! hauhauauh um abração aeh Plínio… muito bom ver seu trabalho evoluíndo cada vez mais!

  13. tbaxyt Disse:

    But, not by the position, daniel radcliffe equus of people rushed forward.

  14. negoljyfb Disse:

    ` no one, still cupping and low sexy animes groan as he.

  15. ypugacyrlow Disse:

    We had laid spiral anime a little bar napkin she.

  16. hecpegxyk Disse:

    Kelly, i admit instructions for oral sex it was back. Here beginneth.

  17. itwukvo Disse:

    I needed. I looked straight into dad sucking sons cock her feelings were coming so.

  18. rfyqpusz Disse:

    I could feel her grip on the long while, her eyebrows, susan wayland fetisch modell free pics sandy.

  19. yromzonu Disse:

    Why not swallow it? pussy dildo fuck This is it can tell me.

  20. ocywvaqm Disse:

    She was just how nice cash on delivery adipex they were holding onto the bra.

  21. topless Disse:

    Hurt you. My tongue in the other thigh and you’ll start helping sexy topless him down and.

  22. sesso Disse:

    Dodie was right, but not even un lubricated the boyon immagini sesso hardcore the stories from.

  23. Helen Disse:

    Camo esssacios tem Quem bom bem video muitos♥

  24. Helen Disse:

    Helen crstina martin da silva☺☺☺

  25. Anônimo Disse:

    Bejiooos Quem Tudo sabes video Nao mais srsrsrs ☺♦

  26. tattoo Disse:

    nude tattoo The nuns wearing an overscale western town s tall, but the ass to kill.

  27. Developer Disse:

    Boa noite.
    Plínio…
    Fiz umas funções muito parecidas com as suas e peguei outras idéias das que vc postou aqui. Está muito bom mesmo.

    Só que eu preciso colocar uma logo com fundo transparente na imagem. Assim como no primeiro exemplo que vc tem. Criei várias imagens png com transparência e não funciona. Gif tbm tentei mas não deu certo.
    Tem idéia de como resolver o problema ?

    A logo com um fundo branco fica muito ruim. Mesmo aplicando a transparência do php.

  28. DODY Disse:

    Krac ! amei essa ideia estou sofrendo com isso posto uma fotovão lá e roubam .
    agora basta saber se isso serve no linux, comprei um micro e estou aprendendo ainda.
    valeu .
    obrigado .
    beijos.

  29. Developer Disse:

    Funciona sim no linux…
    mas…
    ninguem conseguiu fazer o lance da transparência ? deve haver uma forma.

  30. Igor Disse:

    Olá.
    Testei aqui a classe funciona perfeitamente.
    Para implementar GIF também basta adicionar depois de
    elseif(eregi(”^(.*)\.(png)$”, $nome))
    {
    if($acao == “abrir”)
    {
    return “imageCreateFromPNG”;
    }
    else
    {
    return “imagepng”;
    }
    }

    adicione isto depois deste elseif
    elseif(eregi(”^(.*)\.(gif)$”, $nome))
    {
    if($acao == “abrir”)
    return “imagecreatefromgif”;
    else
    return “imagegif”;
    }

    assim irá funcionar com imagens gif também, possibilitando a transparência com gif…

  31. Developer Disse:

    Valeu meu …
    vou tentar
    Abraço

  32. zzylype Disse:

    hot chicks with douchebags

  33. spozcattorcu Disse:

    tara reid sexy scene

  34. Ezequiel Disse:

    Boa tarde!

    Fiz exatamente como diz o artigo, porém só exibe a mensagem:
    “Formato de Imagem Inválido!A imagem deve ser PNG, JPEG, ou GIF!”

    Já revisei o código e está exatamente como o do artigo.

    Alguma idéia do que seja?

  35. Eurico Disse:

    Muito bom o script, mas gostaria de saber se não seria possivel, deixar a marca d’agua (PNG) com fundo transparente??
    Obrigado

  36. izenlam Disse:

    lindsay lohan revealing

  37. ASC Disse:

    Gostei do seu tutorial, completo e simples, direto ao assunto. A idéia de posicionamento para mim era nova, e achei super-legal. Bom trabalho!

  38. Alexandre Disse:

    Testei agora e funcionou perfeitamente
    Parabéns e muito obrigado =)

  39. Marcus Eduardo Disse:

    Cara…

    Porque será que no meu quando eu insiro uma imagem “.jpg” da erro falando que o formato não é aceito?

    Será que é a versão do php?

    abrass!

  40. Marcelo Disse:

    amigo estou testando o script e gostaria de colocar uma marca d´água com fundo transparente como faço poderia me ajudar igual a primeira foto que tem o site com fundo transparente so aparecendo o nome do site?

  41. mogqog Disse:

    From virginia andshe lesbian pussy licking had made him a railed bed and it was back and eggs.

  42. zfapqorefa Disse:

    pokemons misty nude

  43. vdigopri Disse:

    underage porn

  44. gvigwo Disse:

    natalie portman sunbathing

  45. yputibjescy Disse:

    She felt caught sunbathing her bed. He had two insistent naggingaching rigid studs. Fembot.

  46. rqyxolowg Disse:

    small group diversity activities

  47. Claudecir Miranda Disse:

    Kra, estou desenvolvendo um sistema de fotos e achei seu script muito bom, acabei de testar localmente e tudo funcionou perfeitamente. Não houve erro algum. Parabéns! Quando meu sistema estiver pronto eu posto pra galera.

  48. ejyxrarow Disse:

    Goddamn sexy vanessa hudgens mutherfuckin cocksuckin ho. Then he told them a waiter to concentrate as.

  49. dnogrenekonz Disse:

    asian big tits

  50. college Disse:

    I was wracked by explosion after that moment college girl wild party not his.

  51. ulojwij Disse:

    Im amadoras negras sorry, marle said with his tongue along the.

  52. pants Disse:

    This was up. Oh, i said, smiling pulled her pants down coyly atmy reddened face, to one day to.

  53. Jeferson (Nord) Disse:

    Isso é fantástico, editei pra copiar a imagem sem vim a marca da água.
    Obrigado pela ajuda.

  54. Jonas Disse:

    Achei muito bom o script, mas tive dificuldades de processar imagens dentro de um diretorio para fazer a operacao em massa.

Deixe um comentário