quarta-feira, 23 de fevereiro de 2011

Dicas de Programação: Como criar um Captcha em Java

Para quem não sabe, o Captcha é um sistema de segurança que consiste em criar uma imagem com letras e/ou números que verifica se o usuário não é um robo (bot) através da inserção destes caracteres em um campo digitável.
Vou tentar ensinar, de um modo simples, como criar um destes em Java. :)

1) Primeiro,  é preciso criar um método que gere uma String com letras aleatórias (a instrução abaixo gera 4 letras):

String letters = "";
//Cria string com 4 digitos
for (int i = 0; i < 4; i++) {
//Escolhe um caracter entre 'A' e 'Z' (26 caracteres)
char character = (char)(((int)'A') + Math.random() * 25);
letters += character;
}

2) Para desenhar os caracteres, você precisa usar os objetos BufferedImage e Graphics dos pacotes java.awt e java.awt.image:

BufferedImage image = new BufferedImage(<largura_da_imagem>, <altura_da_imagem>, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();

3) Coloque o fundo da imagem na cor branca, através dos métodos setColor  e fillRect do objeto Graphics:

graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, <largura_da_imagem>, <altura_da_imagem>);       

4) Utilize os métodos drawString, setFont e setColor do objeto Graphics para desenhar e colorir a String:

graphics.setFont(new Font("Arial", Font.BOLD, <tamanho_da_fonte>));
graphics.setColor(Color.BLUE);
graphics.drawString(letters, <posição_horizontal>, <posição_vertical>);

5) Para criar linhas sobre as letras, utilize o método drawLine do objeto Graphics:

graphics.drawLine(<posição_horizontal_inicial>, <posição_vertical_inicial>, <posição_horizontal_final>, <posição_vertical_final>);

6) Para salvar a imagem, você deve usar as classes FileOutputStream e ImageIO dos pacotes java.io e javax.imageio:

image.flush();
FileOutputStream output = new FileOutputStream("captcha.png");
ImageIO.write(image, "png", output);
output.close();

7) Se em vez de salvar em arquivo, quiser salvar em memória, utilize a classe ByteArrayOutputStream do java.io:

image.flush();
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(image, "png", output);
byte[] data = output.toByteArray();
output.close();

Tomara que isso ajude alguém. :P

Clique aqui para o código-fonte completo.

2 comentários:

Valter Gabriel disse...

Ola, muito obrigado pela dica, me ajudou muito em meu trabalho para a facu.
Eu achei alguns metodos que criam automatico isso
mais eu queria algo mais manual e encontrei o blog!

Obrigadão ^^

Takemura disse...

Eu que agradeço!
Legal poder te ajudar! :)