Criando um sistema de verificação usando imagens
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:
Armazenei o valor em uma sessão, assim fica mais fácil de utilizar texto depois.
O resultado :
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 :
Bom artigo.
20/11/2008 4:26am
(~16 anos atrás)
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
(~18 anos atrás)
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
(~19 anos atrás)
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
(~19 anos atrás)
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??
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
(~19 anos atrás)
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
(~20 anos atrás)
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
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
(~20 anos atrás)