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.
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Captcha {
private String letters;
private BufferedImage buffer;
public static final int HEIGHT = 50;
public static final int WIDTH = 120;
public static final Font FONT_DEFAULT = new Font("Arial",
Font.BOLD, 30);
private static final Color[] COLORS_DEFAULT = {Color.BLUE,
Color.MAGENTA,
Color.GRAY,
Color.GREEN,
Color.RED,
Color.BLACK};
public Captcha() {
letters = getRandomLetters();
buffer = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics graphics = buffer.getGraphics();
graphics.setFont(FONT_DEFAULT);
clearImage(graphics);
for (int i = 0; i < letters.length(); i++) {
graphics.setColor(getRandomColor());
graphics.drawString("" + letters.charAt(i),
1 + (i * 30), 35);
}
for(int i = 0; i < 5; i++) {
graphics.setColor(getRandomColor());
drawRandomLine(graphics, WIDTH, HEIGHT);
}
buffer.flush();
}
private void clearImage(Graphics graphics) {
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, WIDTH, HEIGHT);
}
private Color getRandomColor() {
return COLORS_DEFAULT[(int)(Math.random() * 5)];
}
private String getRandomLetters() {
String letters = "";
for (int i = 0; i < 4; i++) {
char character = (char)(((int)'A') + Math.random() * 25);
letters += character;
}
return letters;
}
private void drawRandomLine(Graphics g, int width, int height) {
int x1 = (int) (Math.random() * width);
int x2 = (int) (Math.random() * width);
int y1 = (int) (Math.random() * height);
int y2 = (int) (Math.random() * height);
g.drawLine(x1, y1, x2, y2);
}
public void saveFile(File file) throws IOException {
FileOutputStream output = new FileOutputStream(file);
String extension = file.getName();
extension = extension.substring(extension.indexOf('.') + 1);
ImageIO.write(buffer, extension, output);
output.close();
}
public byte[] getBytes() throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(buffer, "png", output);
byte[] data = output.toByteArray();
output.close();
return data;
}
public String getLetters() {
return letters;
}
public static void main(String[] args) throws Exception {
Captcha captcha = new Captcha();
captcha.saveFile(new File("teste.png"));
}
}
|
2 comentários:
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 ^^
Eu que agradeço!
Legal poder te ajudar! :)
Postar um comentário