+1

Criando um sistema de verificação usando imagens

criado por Rodrigo Romano Moreira em 20/07/2004 9:26am
Para começar, crie um script chamado imagem.php e diretório com fontes Fontes TrueType. Não esqueça das fontes também.
Todas funções da biblioteca GD utilizam as cores no formato RGB. Utilizo as cores no formato hexadecimal, mas comum na web. Por isso criei uma função para converter de hexadecimal para rgb.
Quanto mais cores e fontes, melhor resultado. De preferência cores escuras.
Para dificultar a utilização de algum programa OCR, criei algumas linhas e quadrados. As cores e posição são aleatórias.

O script imagem.php:

<?php
session_start();
header("Content-type: image/png");

class createimage{
   // Matriz para criar o texto para imagem
   var $str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   var $width = 160;//Largura da imagem
   var $height = 60;//Altura da imagem

   // Arquivos com Fontes TrueType
   var $fonts = array("arial.ttf","times.ttf","cour.ttf",
		      "verdana.ttf","impact.ttf");

   // Diretório da Fontes				  
   var	$path = "f:/rodrigo/fonts/";

   // Cores no formato hexadecimal			  
   var $hexcolors = array("#FFFF00", "#000000", "#FF0000", "#FF00FF", "#808080", "#008000", "#00FF00", "#000080", "#800000", "#008080", "#800080", "#0000FF", "#C0C0C0", "#808000", "#00FFFF");

   var $image;

   // Gera uma semente para ser utilizada pela função srand
   function make_seed() {
       list($usec, $sec) = explode(' ', microtime());
       return (float) $sec + ((float) $usec * 100000);
   }

   // Converte hexadecimal para rgb 
   function hex2rgb($hex) {
       $hex = str_replace('#','',$hex);
       $rgb = array('r' => hexdec(substr($hex,0,2)),
                    'g' => hexdec(substr($hex,2,2)),
                    'b' => hexdec(substr($hex,4,2)));
       return $rgb;
   } 
   
   // Aloca uma cor para imagem
   function color($value){
       $rgb = $this->hex2rgb($value);
       return ImageColorAllocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']);
   }
   
   // Aloca uma cor aleatória para imagem 
   function randcolor(){
       srand($this->make_seed());
       shuffle($this->hexcolors);
       return $this->color($this->hexcolors[0]);   
   }
   
   // Cria uma linha em  posição e cor aleatória 
   function randline(){
       srand($this->make_seed());
       shuffle($this->hexcolors);
       $i=rand(0, $this->width);
       $k=rand(0, $this->width);
       imagesetthickness ($this->image, 2);
       imageline($this->image,$i,0,$k,$this->height,$this->randcolor());   
   }
   
   // Cria um quadrado 10X10 em posição e cor aleatória
   function randsquare(){
       imagesetthickness ($this->image, 1);
       srand($this->make_seed());
       $x=rand(0, ($this->width-15));
       $y=rand(0, ($this->height-15));
       imageFilledRectangle( $this->image, $x, $y, $x+10, $y+10, $this->color('#EFEFEF'));
       imagerectangle ( $this->image, $x, $y, $x+10, $y+10, $this->randcolor());
   }
   
   // Cria uma imagem com texto aleatório e retorno o texto
   function output(){
       $defstr="";
       $this->image = ImageCreate($this->width,$this->height);
       $background = $this->color('#EFEFEF');  
       imageFilledRectangle($this->image, 0,0,$this->width , $this->height, $background);
       srand($this->make_seed());
       for ($i=0;$i < 4;$i++) {
            $this->str=str_shuffle($this->str);
            shuffle($this->hexcolors);
            shuffle($this->fonts);
            $char=$this->str[0];
            $defstr.=$char;
            imagettftext($this->image, 35, 0,($i*40+5), rand(40,($this->height-10)),         $this->randcolor(), $this->path.$this->fonts[0],$char);
       }

       for ($k=0;$k < 3;$k++){
	    $this->randline(); 
            $this->randsquare();
       }
       
       ImagePng($this->image);
       ImageDestroy($this->image);
       return $defstr;
   }
}
$img = new createimage;
$_SESSION["valor"]=$img->output();
?> 

Armazenei o valor em uma sessão, assim fica mais fácil de utilizar texto depois.
O resultado :

Comentários:

Mostrando 1 - 10 de 30 comentários
Dam disse:
Bom artigo.
20/11/2008 4:26am (~13 anos atrás)

Weldys Santos disse:
O código tah perfeito, to rodando aqui e esse eh um script q venho procurando fazer e tem sempre dado pau!! rsrs... mas esse que você fez está otimo. o unico pro eh q os comentarios naum saum suficentes... mas mexendo um pokinho da pra pegar a manha dele.... Valeu
12/03/2006 9:22am (~16 anos atrás)

Douglas Lira disse:
Olha só estou usando on-line uma plataforma linux, poww se possivel me passa seu MSN pra gente pode ver isso direitinho, por favor!!
24/12/2005 4:19am (~16 anos atrás)

Tem a biblioteca gd? Onde está rodando o
script.
05/12/2005 3:25am (~16 anos atrás)

Douglas Lira disse:
Bom cara eu adaptei seu script em um site meu, só que acontece o seguinte, na hora de fazer a imagem aparecer, ela não aparece, mas quando coloco off-line fica perfeito, acho que o problema está na variavel $patch pois quando coloco o caminho do windows das fontes funciona perfeito, mas on-line dá erro! ajuda ae por favor!
04/12/2005 7:44pm (~16 anos atrás)

Paulo Hinkel disse:
cara.. assimm
a imagem gera normal, e verifica normal..
mas ao implementar na pa]ágina original, da o seguinte erro:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at c:\Paginas\plu\2\iss\index2.php:11) in c:\Paginas\plu\2\iss\index2.php on line 56

se eu comentar o session_start(), ele nao consegue verificar.. oO.. o q fazer pra tirar o erro??
29/04/2005 4:31pm (~17 anos atrás)

Isso aí Rodrigo! Obrigado
20/08/2004 6:38pm (~18 anos atrás)

Ivan Sergei disse:
Pra quem está testando e desenvolvendo páginas usando a autenticação com código/imagem fica uma dica: testei o script rodando em win2000 e percebi que se o caminho do diretório "fonts" estiver $path = ""; a imagem será gerada normalmente no navegador. De alguma maneira var $fonts = array ("arial.ttf","times.ttf","cour.ttf","verdana.ttf","impact.ttf"); está sendo interpretado de maneira a permitir que a aplicação encontre as fontes.
16/08/2004 3:53pm (~18 anos atrás)

Tiago Fachini disse:
Bacana mesmo. Com a biblioteca fica tudo ok.
03/08/2004 10:52am (~18 anos atrás)

Richard disse:
eu vou procurar as fontes.
Eu alterei ele, coloquei o alfabeto em minusculo e funcionou. Deixa ele como dica para o pessoal.

Tem msn?

[]´s
Richard
25/07/2004 10:43pm (~18 anos atrás)

Novo Comentário:

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