+1

Gerando Imagens Dinamicamente

criado por Luiz Ribeiro em 13/04/2002 9:07am
Nesta parte do artigo, irei explicar como desenhar retângulos, polígonos e arcos.

Desenhando retângulos

Vamos ao primeiro exemplo, que irá desenhar um simples retângulo preenchido usando GD (o formato da imagem a seguir é PNG).

<?php
header("Content-type: image/png");
$imagem = ImageCreate(100, 20);
$branco = ImageColorAllocate($imagem, 255, 255, 255);
$azul = ImageColorAllocate($imagem, 20, 93, 233);
ImageFilledRectangle($imagem, 5, 10, 60, 14, $azul);
ImagePng($imagem);
ImageDestroy($imagem);
?>

Bom, neste exemplo só há uma função nova, a função ImageFilledRectangle() que como seu próprio nome diz é uma função que cria um retângulo com as dimensões e posição informadas, e na cor azul, que foi definida na variável $azul.

Já para criar um retângulo sem preenchimento você simplesmente irá trocar a função ImageFilledRectangle() por ImageRectangle(). O exemplo ficará da seguinte forma:

<?php
header("Content-type: image/png");
$imagem = ImageCreate(100, 20);
$branco = ImageColorAllocate($imagem, 255, 255, 255);
$azul = ImageColorAllocate($imagem, 20, 93, 233);
ImageRectangle($imagem, 5, 10, 60, 14, $azul);
ImagePng($imagem);
ImageDestroy($imagem);
?>

Como foi dito, este exemplo irá criar uma imagem com um retângulo sem preenchimento, mas sua borda terá a cor $azul.

Desenhando polígonos

Para desenhar polígonos, vamos usar a função ImagePolygon(), que irá criar um polígono sem preenchimento, e a função ImageFilledPolygon() que irá desenhar um polígono com preenchimento.

Em nosso primeiro exemplo, vamos desenhar um polígono com vértices de (12, 10), (15, 20), (50, 17) e (70, 10) com uma borda de azul-claro:

<?php
header("Content-type: image/png");
$imagem = ImageCreate(100, 20);
$branco = ImageColorAllocate($imagem, 255, 255, 255);
$azul = ImageColorAllocate($imagem, 20, 93, 233);
$pontos = array(12, 10, 15, 20, 50, 17, 70, 10);
ImagePolygon($imagem, $pontos, 4, $azul);
ImagePng($imagem);
ImageDestroy($imagem);
?>

Bom, agora vamos criar um polígono preenchido, você já deve ter pensado que o código será o mesmo, mas ao invés de ImagePolygon() usaremos ImageFilledPolygon(), se você énsou isso, acertou em cheio. Vamos ver como ficaria nossa imagem com um retângulo preenchido:

<?php
header("Content-type: image/png");
$imagem = ImageCreate(100, 20);
$branco = ImageColorAllocate($imagem, 255, 255, 255);
$azul = ImageColorAllocate($imagem, 20, 93, 233);
$pontos = array(12, 10, 15, 20, 50, 17, 70, 10);
ImageFilledPolygon($imagem, $pontos, 4, $azul);
ImagePng($imagem);
ImageDestroy($imagem);
?>

Desenhando arcos

Bom, agora vamos desenhar alguns arcos em nossas imagens, para isso vamos usar a função ImageArc(). Antes de começarmos, vou passar a sintaxe da função:

int ImageArc(int im, int cx, int cy, int w, int h, int s, int e, int co1);

Esta função desenha um arco em uma imagem, im, com uma posição inicial de X de cx e uma posição inicial Y de cy. O arco é de largura w e altura h, com um ângulo inicial de s e um ângulo final de e, tudo na cor co1.

Agora que já entendemos a função ImageArc() vamos ao nosso primeiro exemplo que irá desenhar uma elipse:

<?php
header("Content-type: image/gif");
$imagem = ImageCreate(500, 100);
$branco = ImageColorAllocate($imagem, 255, 255, 255);
ImageColorTransparent($imagem, $branco);
$vermelho = ImageColorAllocate($imagem, 20, 93, 233);
ImageArc($imagem, 40, 50, 50, 40, 0, 360, $vermelho);
ImageGif($imagem);
ImageDestroy($imagem);
?>

O código acima funciona, pois para ter uma elipse, você precisa de uma diferença de 360 graus entre a posição inicial e a posição final. Aplicando esse conhecimento, também podemos desenhar um círculo preenchido usando a função ImageFillToBorder(). (Note que isso é um círculo, não uma elipse, porque os parâmetros de largura e altura têm o mesmo valor.)

<?php
header("Content-type: image/gif");
$imagem = ImageCreate(500, 100);
$branco = ImageColorAllocate($imagem, 255, 255, 255);
ImageColorTransparent($imagem, $branco);
$vermelho = ImageColorAllocate($imagem, 20, 93, 233);
ImageArc($imagem, 40, 50, 50, 50, 0, 360, $vermelho);
ImageFillToBorder($imagem, 50, 40, $vermelho
ImageGif($imagem);
ImageDestroy($imagem);
?>

Observação: os exemplos acima foram retirados do livro PHP: Guia do Desenvolvedor que está na lista de livros recomendados da PHPBrasil. Nos exemplos só foram alterados os nomes de algumas variáveis para facilitar a compreensão.

Bom, esse é o básico do módulo GD. Você com certeza tem muito a explorar ainda, em breve vou trazer mais alguns artigos sobre o assunto, para os que se interessaram, ou não entenderam alguma função podem ver no manual do PHP todas as funções de imagem:
http://br.php.net/manual/pt_BR/ref.image.php

Abraços,
Luiz Gustavo Cardoso Ribeiro

Comentários:

Mostrando 1 - 10 de 14 comentários
Tentem usar a função imagejpeg() ao invés de ImageGif() e utilize a DLL php_gd2.dll ! acho q dae funciona!
06/03/2005 5:41pm (~20 anos atrás)

Edmund Macruz disse:
Gente
php.ini
extension_dir = D:\PHP\extensions (existe esse diretório e descompactei o gd nele juntamente com a php_gd.dll)
deletei o ; da linha extension=php_gd.dll
qdo mando rodar
Content-type: text/html X-Powered-By: PHP/4.3.1 PHP Warning: Unknown(): Unable to load dynamic library 'D:\PHP\extensions\php_gd.dll' - Não foi possível encontrar o procedimento especificado. in Unknown on line 0
alguem pode me ajudar
19/02/2004 7:49am (~21 anos atrás)

Cara, eu configurei tudo e tal.... Mas em que pasta exatamente eu colo os arquivos do .zip? Coloquei na pasta c:\php\gd, configurei no php.ini e mesmo assim ta dando erro...
28/02/2003 3:23pm (~22 anos atrás)

Apesar do link ser pro Manual em português, está escrito em inglês.

http://www.php.net/manual/pt_BR/ref.image.php
30/10/2002 8:53am (~22 anos atrás)

Luiz Ribeiro disse:
Simplesmente coloque o php_gd.dll no extension_dir (que está definido em seu php.ini).

Abraços,
Luiz Gustavo Cardoso Ribeiro
19/05/2002 4:55pm (~22 anos atrás)

Eu sei que tem que tirar o ; da extension=php_gd.dll
Até ai não tem drama e depois onde eu descompacto o gd-1.8.4.zip? em que pasta??
Valeu.
18/05/2002 7:58pm (~22 anos atrás)

Luiz Ribeiro disse:
Seguinte cara,
Você esqueceu de definir a extensão usando:
extension=php_gd.dll

Ele simplesmente não encontra a função pois você apenas colocou a dll no dir, você precisa informar ao php que é para ele usar a extensão da gd.

Peço desculpas novamente por ter me esquecido de falar isso em meus primeiros comentários...

Abraços,
Luiz Gustavo Cardoso Ribeiro
24/04/2002 9:11pm (~23 anos atrás)

Luiz Ribeiro disse:
Rafael, eu acho que tem, é só você colocar o arquivo php_gd.dll no diretório onde estão suas extensões do php (que está definido em seu php.ini).

E tem uma outra coisa que eu esqueci de citar anteriormente, além de você colocar a extensão no diretório, você deve incluir a extensão em seu php.ini da seguinte forma:
extension=php_gd.dll

Você provavelmente tem essa linha em seu php.ini já, mas comentada, se não tiver, é só adicionar ela...

Se você não souber qual o seu diretório de extensões do PHP, você pode ver em seu php.ini isso, por exemplo, no meu arquivo está assim:
extension_dir = D:\PHP\extensions

Logo, é só você procurar por extension_dir dentro de tal arquivo...

Espero ter solucionado as dúvidas de vocês!

Abraços,
Luiz Gustavo Cardoso Ribeiro
18/04/2002 5:12pm (~23 anos atrás)

tem como fazer isso rodando no PHPTriad???
17/04/2002 5:33pm (~23 anos atrás)

Luiz Ribeiro disse:
Não... Plataformas unix também podem usar, mas eu não tenho conhecimento de como fazer isso.

Vou procurar material sobre o assunto, se eu encontrar, eu coloco aqui a url...

Abraços,
Luiz Gustavo Cardoso Ribeiro
17/04/2002 11:51am (~23 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)