Com PHP e a biblioteca GD você poderá manipular qualquer tipo de imagem. Isso inclui criar redimensionar imagens, Criar imagens a partir de textos

Atenção: Verifique se a biblioteca GD esta instalada no phpinfo(); Veja a imagem abaixo.

1° Exemplo: Escrever em uma imagem já existente

Esta é uma tarefa simples. Veja o exemplo comentado e expolicado:

<?php
// Carregar imagem já existente no servidor
$imagem = imagecreatefromjpeg( "foto.jpg" );
/* @Parametros
 * "foto.jpg" - Caminho relativo ou absoluto da imagem a ser carregada.
 */

// Cor de saída
$cor = imagecolorallocate( $imagem, 255, 255, 255 );
/* @Parametros
 * $imagem - Imagem previamente criada Usei imagecreatefromjpeg
 * 255 - Cor vermelha ( RGB )
 * 255 - Cor verde ( RGB )
 * 255 - Cor azul ( RGB )
 * -- No caso acima é branco
 */

// Texto que será escrito na imagem
$nome = urldecode( $_GET['nome'] );
/* @Parametros
 * $_GET['nome'] - Texto que será escrito
 */

// Escrever nome
imagestring( $imagem, 5, 15, 515, $nome, $cor );
/* @Parametros
 * $imagem - Imagem previamente criada Usei imagecreatefromjpeg
 * 5 - tamanho da fonte. Valores de 1 a 5
 * 15 - Posição X do texto na imagem
 * 515 - Posição Y do texto na imagem
 * $nome - Texto que será escrito
 * $cor - Cor criada pelo imagecolorallocate
 */

// Header informando que é uma imagem JPEG
header( 'Content-type: image/jpeg' );

// eEnvia a imagem para o borwser ou arquivo
imagejpeg( $imagem, NULL, 80 );
/* @Parametros
 * $imagem - Imagem previamente criada Usei imagecreatefromjpeg
 * NULL - O caminho para salvar o arquivo. 
          Se não definido NULL a imagem será mostrado no browser. 
 * 80 - Qualidade da compresão da imagem.
 */

Veja o exemplo funcionando em http://php.eduardokraus.com/code/10026/index1.php. Estou usando minha foto do facebook.

2° Exemplo: Criando imagem para leitor de códigos de barras

Esta é uma dúvida comum. Mas o PHP resolve rápido rápido. Veja o exemplo comentado abaixo:

<?php
$tamanhofonte = 100;
// Fonte de código de barras que eu tenho em um sistema
$fonte = 'c39hrp48dhtt.ttf';

// Texto que será impresso na imagem
// Para que funcione com leitores é necessário
// que seja iniciado e finalizado a String com o caracter '*'
$texto = "*" . $_GET['nome'] . "*";

// Retorna o tamanho da imagem criada pela fonte acima carregada.
$tamanho = imagettfbbox($tamanhofonte, 0, $fonte, $texto);
$largura = $tamanho[2] + $tamanho[0] + 8;
$altura = abs($tamanho[1]) + abs($tamanho[7]);

// cria a imagem exatamente do tamanho informado pelo imagettfbbox
$imagem = imagecreate($largura, $altura);
/* @Parametros
 * $largura - Largura que deve ser criada a imagem
 * $altura - Altura que deve ser criada a imagem
 */

// Primeira chamada do imagecolorallocate cria a cor de fundo da imagem
imagecolorallocate($imagem, 255, 255, 255);

// As demais chamadas criam cores para serem usadas na imagem
$preto = imagecolorallocate($imagem, 0, 0, 0);

// Adiciona o texto a imagem
imagefttext($imagem, $tamanhofonte, 0, 0, abs($tamanho[5]), $preto, $fonte, $texto);
/* @Parametros
 * $imagem - Imagem previamente criada Usei imagecreate.
             poderia ter usado o imagecreatefromjpeg
 * $tamanhofonte - Tamanho da fonte em pixel
 * 0 - Posição X do texto na imagem
 * 0 - Posição Y do texto na imagem
 * abs($tamanho[5]) - Corrige o Y
 * $preto - Cor do texto
 * $fonte - Caminho relativo ou absoluto da fonte a ser carregada.
 * $texto - Texto que deverá ser escrito
 */

// Header informando que é uma imagem JPEG
header( 'Content-type: image/jpeg' );

// eEnvia a imagem para o borwser ou arquivo
imagejpeg( $imagem, NULL, 80 );
/* @Parametros
 * $imagem - Imagem previamente criada Usei imagecreatefromjpeg
 * NULL - O caminho para salvar o arquivo. 
          Se não definido ou NULL, o stream da imagem será mostrado diretamente. 
 * 80 - Qualidade da compresão da imagem.
 */

Veja o exemplo funcionando em http://php.eduardokraus.com/code/10026/index2.php.

Quer o código fonte completo deste exemplo? Clique aqui.

Ficou com dúvidas, comente abaixo.

Gostou? Não esqueça de curtir!

49 comentários

Deixe uma resposta

  1. Muito legal!! Mas sou novato em PHP. Como posso mudar a fonte que está usando?

     
  2. na linha 4 altere a fonte escrita ali , no caso você pega a fonte na internet formato ttf . exemplo Arial.ttf e coloca no mesmo caminho do arquivo

     
  3. Olá td bem? Muito bom seu artigo! Baixei o exemplo e já fiz vários testes, inclusive alguns que estão aqui nos comentários... só não encontrei uma forma de adicionar efeito no texto, como por exemplo o "text-shadow" do CSS. Tem alguma forma ou recurso para colocar efeitos nos escritos?

     
  4. Já consegui.... usando: imagettftextblur

     
  5. Excelente o artigo, inclusive com o código fonte para baixar. Já tinha código praticamente igual mas os comandos não funcionavam. Baixei o seu e percebi que funcionou perfeitamente. Por fim, descobri que havia escondido em meu arquivo um caracter especial oculto que impedia o funcionamento do comando imagejpeg.

     
  6. Excelente o artigo, inclusive com o código fonte para baixar. Já tinha código praticamente igual mas os comandos não funcionavam. Baixei o seu e percebi que funcionou perfeitamente. Por fim, descobri que havia escondido em meu arquivo um caracter especial oculto que impedia o funcionamento do comando imagejpeg.

     
  7. Poderia me passar seu arquivo completo dos dois? pois o meu não está funcionando corretamente.

    Abraço,
    Mateus

     
  8. No POST tem: "Quer o código fonte completo deste exemplo? Clique aqui."

     
  9. Olá Eduardo, bom dia.
    Tive uma ideia de fazer um procedimento com essa sua dica, assim a imagem seria ilustrada com os dados reais.

    Exemplo de procedimento que poderia ser feito. Este sei não é meu...
    http://www.configuraroutlook.com/outlook2010gmail.php

    Só encontrei um problema com acentuação. Têm como ajustar isso?

    abraço,
    Henrique

     
  10. consegui resolver o problema do acento com esse artigo.

    http://stackoverflow.com/questions/5550309/php-urldecode-utf8-encode-character-set-issues-with-special-characters

    o código que usei foi esse
    $nome = utf8_decode(urldecode( $_GET['nome'] ));

     
  11. Boa tarde professor,

    Você poderia me indicar uma classe onde eu pudesse ancorar(selecionar) uma região da imagem e me gerar um arquivo somente com a região?

    Exemplo: Capturar a região onde está posicionado a data de vencimento de um boleto bancário.

    Sds,

     
  12. Boa tarde, como faço pra adicionar mais campos para preenchimento? (Nome, idade, data, horário) Obrigado!

     
  13. No arquivo index1.php procura as linhas:
    1. $nome = isset($_GET['nome'])?$_GET['nome']:"";
    2. <input name="nome" type="text" value="<?php echo $nome ?>" size="100" placeholder="Seu Nome"/>
    3. <td align="center" valign="middle">    <img src="ex1.php?nome=<?php echo $nome ?>/>

    No arquivo ex1.php procura as linhas
    1. $nome = urldecode( $_GET['nome'] );
    2. imagestring( $imagem, 5, 225, 130, $nome, $cor );

    Acho que é isso

     
  14. Muuuuuito bom tutorial

     
  15. Como faço pra adicionar quebra de linha no texto? Testei seu exemplo com um texto grande e ele extrapolu a imagem, não coube todo...

     
  16. A imagem que eu usei como base para criar a nova com o texto, possui cor de fundo em branco e azul escuro, mas quando crio a nova imagem e escrevo o texto nela o azul que era escuro passa a tomar um tom mais claro. o que pode estar causando isso e o que fazer para corrigir?

     
  17. Este problema é gerado ao exportar o JPG.

    Para corrigir, podes tentar atualizar a biblioteca GD, ou aumentar o valor ao exportar a imagem em imagejpeg( $imagem, NULL, 80 ); Troque o 80 por 100 e faça um teste.

    Teste também com o imagepng( $imagem, NULL);

     
  18. Tem como eu fazer para sempre o texto for adicionado no final da imagem?

    tipo na parte do codigo aonde coloca a localizacao imagestring( $imagem, 5, 15, 515, $nome, $cor );

    em vez de colocar a posição em x e y colocar para sempre ficar no final do lado direito...

     
  19. E teria como depois da imagem ser gerada, ela ser mandada por get ou post para uma outra página que eu especificasse?

     
  20. Ai você teria que usar o CURL.

     
  21. Em que parte do código eu colocaria esse Curl?

     
  22. Eduardo, tentei utilizar mas retorna o ícone de imagem com link quebrado, tem algum detalhe que devo tratar?

     
  23. Isso significa que houve erro de PHP.

    Confira os LOGS do PHP e veja quais erros aconteceram.

     
  24. Sou novo com PHP e imagens e gostaria de saber como coloco mais de um texto na mesma imagem, ficarei grato pela ajuda.

     
  25. Você pode chamar várias vezes a função imagestring. Cada chamada desta função irá adicionar uma nova linha á imagem.

     
  26. Olá Eduardo,

    há alguma forma de colocar fontes com tamanho maior que este máximo que a biblioteca oferece?

     
  27. A função imagefttext aceita fontes maiores que a função imagestring.

     
  28. Muito Obrigado pela atenção!
    Encontrei no manual a imagettftext depois de perguntar no seu site.

     
  29. olá, gostaria de saber se tem como alinhar o texto digitado no centro, se tiver como, gostaria de saber qual o código. Obrigado!

     
  30. Olá

    Uma dúvida bacana e muito simples de resolver.

    Primeiro você deve calcular o comprimento que a frase irá ocupar com a função imagettfbbox.  

    $tamanho = imagettfbbox($tamanhofonte, 0, $fonte, $texto);
    Agora tem-se a largura da seguinte forma:
    $larguraTexto = $tamanho[2] + $tamanho[0];
    Com a largura do texto e a largura da imagem fazemos da seguinte forma:
    $larguraImagem = imagesx($imagem);
    $x = ( $larguraImagem - $larguraTexto ) / 2;
    imagefttext($imagem, $tamanhofonte, $x, 0, abs($tamanho[5]), $preto, $fonte, $texto);
    Porque eu dividi por dois a diferença? Simples, os textos centralizados devem ser divididos os espaços para os dois lados. Então a diferença entre a largura da imagem e a largura do texto devem ser divididos por dois. Metade antes e metade depois...

     
  31. Da para usar esse tipo de função com a biblioteca GD assim:

    GD
    GD Support    enabled
    GD Version    bundled (2.0.34 compatible)
    FreeType Support    enabled
    FreeType Linkage    with freetype
    FreeType Version    2.3.11
    GIF Read Support    enabled
    GIF Create Support    enabled
    JPG Support    enabled
    PNG Support    enabled
    WBMP Support    enabled
    XBM Support    enabled

    porque não funciona :(

     
  32. Então a imagem não aparece, nem com o básico não aparece nada.
    Eu uso o Xampp, no xampp funciona normalmente e quando eu hospedo o site na internet não surge nada, já olhei varias vezes e não encontrei nenhum erro mas continua a não aparecer.

     
  33. Muito obrigado pela postagem. Ajudou muito.

     
  34. Eduardo,

    Seguindo o raciocinio da vivian:

    "entao consegui fazer isso, mas se mais pessoas fizerem ao mesmo tempo complicou.
    Por isso que seria melhor colocar um numero sequencial para cada um que acessar ...

    fotonova_00001.jpg
    fotonova_00002.jpg
    e assim por diante..."

    Como eu faria para salvar cada arquivo com um nome diferente/sequencial?

    Obrigado!

     
  35. Não. Se você usar ID do banco de dados isso não ocorre. O banco de dados sempre retornará um ID único.

    Ou ainda podes usar a função http://br.php.net/uniqid

     
  36. oi professor
    eu preciso inserir um numero exclusivo para cada foto tambem. como eu faço? Registro N° C11111111 que vou colocar em uma posicao da foto... e assim por diante N° C11111112...
    tem como registrar em um arquivo texto?

     
  37. O mais indicado é trabalhar com Banco de dados. http://php.eduardokraus.com/category/zebd_db

     
  38. entao consegui fazer isso, mas se mais pessoas fizerem ao mesmo tempo complicou.
    Por isso que seria melhor colocar um numero sequencial para cada um que acessar ...

    fotonova_00001.jpg
    fotonova_00002.jpg
    e assim por diante...

     
  39. Você pode agora implementar da forma que melhor atenda a sua necessidade.

     
  40. oi..
    eu nao sou loira.. mas acho que sou burrinha dimais
    naum entendi...
    desculpe
    rsrsrs
    bjos

     
  41. O método imagejpeg aguarda três parâmetros. Primeiro deles é a imagem a que foi tratada.
    Segundo parâmetro é o caminho que a imagem deverá ser salvo no disco. Se você informar valores diferentes de NULL a função tentará salvar esta imagem.
    Ex:

    imagejpeg( $imagem, "fotoNova.jpg", 80 );
    Então o exemplo acima irá salvar a imagem com nome de "fotoNova.jpg" no disco. exceto por falta de permissão.

     
  42. muito bom este post, me ajudou a desenvolver o que eu precisava so falta eu conseguir salvar a imagem com o texto, mas quando eu coloco imagejpeg( $imagem, "fotoNova.jpg", 80 ); ele não exibe mais a imagem e não salva o arquivo, já dei permissão 777 na pasta e mesmo assim não consegui salvar ela com outro nome.

     
  43. oi Eduardo
    vc naum entendeu ou nao consegui me expressar
    o exemplo da marca dagua nao gera uma nova imagem, para posteriormente o usuario ver quando quiser ou gera? eu nao vi no codigo.
    como sao pelo menos 15 entradas de texto que quero fazer, digitar toda vez é ruim ne.. o melhor seria trazer do banco do usuario wordpress e/ou vindo da primeira vez do formulario e deixar gravado.

    http://site/carteirinhas/cart00002.jpg

    obrigada

     
  44. imagejpeg( $imagem, NULL, 80 );
    /* @Parametros
     * $imagem - Imagem previamente criada Usei imagecreatefromjpeg
     * NULL - O caminho para salvar o arquivo. 
              Se não definido ou NULL, o stream da imagem será mostrado diretamente. 
     * 80 - Qualidade da compresão da imagem.
     */

     
  45. oi professor
    legal seu exemplo e ja me ajudou a entender, obrigada por criar este exemplo.

    mas como coloco uma imagem dentro de outra imagem, por exemplo uma foto dentro de um cracha? e junto com outros textos enviados por formulario e que o usuario wordpress podera receber em seu email ou ver quando quiser?

    obrigada e parabens pelo site