Revista Do Linux
 
  
  
 

  Capa
  Evento
  Serviço Público
  Tutorial Programação Shell
  Tutorial PHP
  Software
  Entrevista
  Filosofia
assinantes
 

Criando imagens com PHP

A criação dinâmica de imagens é uma função importante e útil do PHP, pois ela nos possibilita, por exemplo, a criação de gráficos para enquetes ou botões dinâmicos padronizados para websites, sem a necessidade de encher o servidor com arquivos de imagem.

O primeiro passo é ativar o suporte à imagens em sua cópia do PHP. A biblioteca gd já acompanha o próprio PHP a partir da versão 4.3. Caso esteja usando uma versão inferior, você poderá fazer o download da biblioteca no endereço www.boutell.com/gd/. No caso do Windows as imagens do tipo PNG e JPEG são suportadas por default. Geralmente as distribuições Linux já instalam as bibliotecas necessárias para a visualização e criação de arquivos jpg e png por default, mas mesmo assim, certifique-se de que a libpng (www.libpng.org/pub/png/), zlib (www.zlib.org/zlib/) e jpeg-6b (ftp://ftp.uu.net/graphics/jpeg) estão instaladas corretamente em seu sistema para poder trabalhar com a gd.

Principais funções de manipulação de imagem

ImageCreate - Cria uma imagem em branco com a dimensão x e y. Sua sintaxe é:

imagecreate (int X, int Y);

Ex: $img=imagecreate (200,100);

imagecolorallocate - Cria uma cor no padrão RGB para ser usada posteriormente. A primeira cor definida será automaticamente usada para o fundo da imagem.

int imagecolorallocate (resource image, int red, int green, int blue);

Ex: imagecolorallocate($img, 200,100,100);

imagestring - Desenha um texto na imagem criada nas posições x e y, com a cor e o tamanho da fonte desejado. Esta função é utilizada, por exemplo, para criar botões e banners dinamicamente.

int imagestring (resource image, int font, int x, int y, string texto, int cor);

Ex: imagestring($img, 4, 10,10, "TEXTO", $cor);

imagepng - Envia ao browser a imagem criada, no formato PNG.

int imagepng (resource image [, string filename]);

Ex: imgpng($img);

imagejpeg - Envia ao browser a imagem criada, no formato JPEG.

int imagejpeg (resource image [, string filename [, int quality]])

Ex: imagejpeg($img,"","72")

Envia ao browser a imagem com qualidade 72. O valor de qualidade vai de 0 a 95, sendo que quanto maior o valor, maior a qualidade e o tamanho da imagem.

imageline - Cria uma linha em uma imagem de acordo com as coordenadas passadas. Muito usada para desenhar as bordas de botões.

int imageline (resource image, int x1, int y1, int x2, int y2, int col)

Ex: imageline($img,$x1,$y1,$x2,$y2,$cor);

Onde $img é o identificador da imagem em que você está criando, $x1 é a posição horizontal, em pixels, do início da linha, $y1 é a posição vertical de início da linha, e $x2 e $y2 são as coordenadas finais da linha. As posições são contadas a partir do canto superior esquerdo da imagem, que equivale à coordenada (0,0).

imagepolygon - Desenha um polígono, com as coordenadas de cada ponto definidas em um array. Veremos um pequeno exemplo do uso de polígonos logo em seguida.

int imagepolygon (resource image, array points, int num_points, int col)

Substitua num_points pelo número de vértices do polígono.

ImageDestroy - Retira a imagem criada da memória.

ImageDestroy (resource image);

Ex: ImageDestroy ($im);

Alguns exemplos
<?php

$img=imagecreate(100,50); $cor_fundo = imagecolorallocate($img, 255,0,0); $cor = imagecolorallocate($img, 0,0,255); imagestring($img, 2, 10,10, &quot;Olá Mundo&quot;, $cor); imagejpeg($img); ImageDestroy($img); ?>

Esse código criará uma imagem de 100x50 pixels, usando vermelho como cor de fundo e apresentando o texto "Olá Mundo", escrito em fonte com tamanho 2 e cor azul. Ela é exibida ao browser no formato JPEG e logo em seguida "destruída", para liberar memória.

Como utilizar em seu website?

Crie o arquivo chamado imagem.php e adicione essas linhas:
<?php

$img=imagecreate(100,50); $cor_fundo = imagecolorallocate($img, 200,100,100); $cor = imagecolorallocate($img, 0,0,255); imagestring($img, 2, 10,10, $_GET[texto], $cor); imagejpeg($img); ImageDestroy($img); ?>

Depois crie um arquivo chamado: exemplo.htm e adicione o código a seguir:

ImageDestroy (resource image);

Depois crie um arquivo chamado: exemplo.htm e adicione o código a seguir:

<html> <title>Imagem gerada dinamicamente</title> <body> <img src=&quot;imagem.php?texto=enviar&quot;> </body> </html>

Execute a página exemplo.htm em algum browser e a saída será uma imagem com o fundo em vermelho e o texto "enviar" em azul. Você pode colocar qualquer string no lugar de "enviar", criando assim um padrão nos botões de seus site. Mas tome cuidado para que o tamanho do texto não seja maior que o tamanho da imagem, ou o texto ficará cortado.

Polígonos

Crie um arquivo chamado poligono.php com o conteúdo a seguir:
<?php

$a = array( &quot;0&quot; => &quot;20&quot;, // x1 &quot;1&quot; => &quot;30&quot;, // y1 &quot;2&quot; => &quot;10&quot;, // x2 &quot;3&quot; => &quot;220&quot;, // y2 &quot;4&quot; => &quot;30&quot;, // x3 &quot;5&quot; => &quot;30&quot;, // y3 &quot;6&quot; => &quot;140&quot;, // x4 &quot;7&quot; => &quot;30&quot;, // y4 &quot;8&quot; => &quot;30&quot;, // x5 &quot;9&quot; => &quot;10&quot;, // y5 &quot;10&quot; => &quot;40&quot;, // x6 &quot;11&quot; => &quot;5&quot;, // y6 ); $im = ImageCreate (250, 250); $branco = ImageColorAllocate ($im, 255, 255, 255); //Fundo da imagem $azul = ImageColorAllocate ($im, 0, 0, 255); //cor do poligono ImageFilledPolygon ($im, $a, 6, $azul); ImagePng ($im); ?>

Depois crie o arquivo exemplo2.htm para exibir a imagem do polígono e adicione as seguintes linhas:

<html> <title>Polígonos</title> <body> <img src=&quot;poligono.php&quot;> </body> </html>

A saída desse arquivo será um polígono de 6 vértices, na cor azul com o fundo branco, no formato PNG.

Criando um sistema de pesquisa

Primeiro vamos criar o banco de dados MySQL. Crie um tabela chamada resultados, com a seguinte estrutura:

id = Int(15) ­ autoincrement id_enquete = Int(15) resposta = char(1)

Agora crie um arquivo chamado enquete.htm. Este arquivo será o responsável por mostrar o formulário com a pergunta e as respostas da pesquisa. Adicione as seguintes linhas:

<html> <title>Exemplo de Enquete</title> <body> <h3>Qual navegador você utiliza?</h3><br> <form name=&quot;form1" method=&quot;post&quot; action=~Tadiciona.php~T> <input type=&quot;radio&quot; name=&quot;tipo~T value=~T1">Firebird<br> <input type=&quot;radio&quot; name=&quot;tipo~T value=~T2">Mozilla<br> <input type=&quot;radio&quot; name=&quot;tipo~T value=~T3">Opera<br> <input type=&quot;hidden&quot; name=&quot;id_enquete~T value=~T1"> <br> <center><input type=&quot;submit&quot; value=&quot;VOTAR~T></center> </body> </html>

Salve as próximas linhas em um arquivo chamado adiciona.php, que será responsável pela inserção dos valores no Banco de Dados.
<?php

include(&quot;bd.php&quot;); //Arquivo responsável pela conexão com o banco de dados $insere = &quot;INSERT INTO resultados (resposta,id_enquete) value (`$_POST[tipo]','$_POST[id_enquete]');&quot;; if(mysql_query($insere)){ echo(&quot;Obrigado por votar!!&quot;); }else{ echo(&quot;erro ao computar o voto&quot;); { ?>

Depois de criadas as páginas e a tabela onde ficarão os dados da enquete, será necessário escrever o script que irá gerar o gráfico. Para isso, crie o arquivo graph.php e adicione as seguintes linhas:
<?

//Criação da imagem $img=imagecreate(10,10); $cor_fundo = imagecolorallocate($img, 200,0,0); imagejpeg($img); ?>

Este arquivo apenas cria uma imagem no tamanho de 10x10 pixels com a cor vermelha. Agora é que vem a parte boa: Crie um arquivo resultado.php e adicione as seguintes linhas:
<?

//seleciona os valores correspondentes a primeira escolha de resposta; include(&quot;conecta_bd.php&quot;); $sel = mysql_query(&quot;SELECT * FROM resultados WHERE id_enquete='1' and resposta='1'&quot;); $valor1 = mysql_num_rows($sel); //seleciona os valores correspondentes a segunda escolha de resposta; $sel2 = mysql_query(&quot;SELECT * FROM resultados WHERE id_enquete='1' and resposta='2'&quot;); $valor2 = mysql_num_rows($sel2); //seleciona os valores correspondentes a terceira escolha de resposta; $sel3 = mysql_query(&quot;SELECT * FROM resultados WHERE id_enquete='1' and resposta='3'&quot;); $valor3 = mysql_num_rows($sel3); $total = $valor1+$valor2+$valor3; $comp1 = ($valor1*100)/$total; $comp2 = ($valor2*100)/$total; $comp3 = ($valor3*100)/$total; echo&quot;<html> <body> <h3>Qual navegador você utiliza?</h3> <img src=\&quot;graph.php\&quot; height=\&quot;7\~T width=\~T$comp1\~T>$comp1 % ($valor1) - Firebird<br> <br> <img src=\&quot;graph.php\&quot; height=\&quot;7\~T width=\~T$comp2\~T>$comp2 % ($valor2) - Mozilla<br> <br> <img src=\&quot;graph.php\&quot; height=\&quot;7\~T width=\~T$comp3\~T>$comp3 % ($valor3) - Opera<br> <br> </body> </html>&quot;; ?>

Analisando o código podemos ver que após se conectar ao banco de dados MySQL usando o arquivo bd.php, é realizada uma busca na tabela que contém os resultados. Estes valores são guardados cada um em sua respectiva variável e, em seguida, são transformados em porcentagem, tornando mais fácil trabalhar com eles. Com as porcentagens na mão, aplicamos os novos valores na propriedade width da imagem que é a sua "largura", deste modo as barras nunca ultrapassarão o valor 100. Neste artigo, os valores da porcentagem e o número total de votos são impressos apenas para ilustrar o gráfico. Veja que a pergunta da enquete e suas possiveis respostas estão estáticas, mas com o campo id_enquete da tabela resultados você poderia ligar a uma outra tabela onde estaria uma nova enquete.

Com este artigo tentei mostrar que funções para manipulação de imagem são simples, porém poderosas. Em poucas linhas de código podemos fazer qualquer tipo de botão ou ainda, criar gráficos de vários tipos para exibir os resultados de alguma pesquisa. Agora cabe a você explorar e descobrir mais sobre esta possibilidade que o PHP nos apresenta.


Nivaldo Pereira de Arruda Neto - neto@vialux.inf.br

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux