验证码图片生成器
驗證碼圖片生成器:http://pan.baidu.com/s/1kUL25Cz
生成算法Algorithm.java
package PictureVerification;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
public class Algorithm{
private static final int size=6;
private static final int WIDTH=30*size;
private static final int HEIGHT=40;
private static final int lineNum=6;
private char[] cstr=new char[size];
public Algorithm() {}
public Image generate(){
int width=WIDTH/size;
int height=HEIGHT;
BufferedImage imagebuf=new BufferedImage(width*size,height, BufferedImage.TYPE_INT_RGB);
Graphics2D g=imagebuf.createGraphics();
int base=0;
for(int i=1;i<size-1;i++){
base=width*i;
Font font =new Font("Tahoma",Font.ITALIC,(int)((Math.random()*(30-10))+10));
g.setFont(font);
double redix = Math.PI*Math.random()/2-Math.PI/4;
g.rotate(redix,base+width/2, height/2);
String str=""+(int)(Math.random()*10);
cstr[i]=str.charAt(0);
g.drawString(str,(int)(base*(1.2)),(int)(height*(0.8)));
g.rotate(-redix,base+width/2, height/2);
}
//加線條
for(int i=0;i<lineNum;i++){
g.setColor(new Color((int)(Math.random()*255),(int)(Math.random()*255),(int)(Math.random()*255)));
int a=(int)(Math.random()*WIDTH);
int b=(int)(Math.random()*HEIGHT);
int c=(int)(Math.random()*WIDTH);
int d=(int)(Math.random()*HEIGHT);
g.drawLine(a, b,c,d);
}
return imagebuf;
}
public String getStr(){
return new String(cstr, 1, cstr.length-2);
}
}
View Code
MenuView.java(展示類)
package PictureVerification;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class MenuView extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JFrame f=this;
private JPanel panel;
private JLabel label;
private ImageIcon image;
private BufferedImage imagebuf;
private JButton btnNewButton_1;
private JLabel lblNewLabel;
private Algorithm algo=new Algorithm();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MenuView frame = new MenuView();
//MyCanvas m=new MyCanvas();
JFrame f=frame;
//f.getContentPane().add(m);
//f.setLayout(null);
f.setVisible(true);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public MenuView() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 301, 256);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
panel = new JPanel(new BorderLayout());
image=new ImageIcon("");
label=new JLabel("",image,JLabel.CENTER);
panel.add(label,BorderLayout.CENTER);
panel.setBounds(31, 30, 221, 97);
contentPane.add(panel);
JButton btnNewButton = new JButton("generate");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
loadImage();
}
});
btnNewButton.setBounds(56, 174, 93, 23);
contentPane.add(btnNewButton);
btnNewButton_1 = new JButton("save");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
saveImage();
}
});
btnNewButton_1.setBounds(159, 174, 93, 23);
contentPane.add(btnNewButton_1);
lblNewLabel = new JLabel("");
lblNewLabel.setBounds(120, 137, 54, 15);
contentPane.add(lblNewLabel);
}
private void loadImage(){
image=new ImageIcon(algo.generate());
label.setIcon(image);
lblNewLabel.setText(algo.getStr());
}
private void saveImage(){
BufferedImage imagebuf=null;;
try {
imagebuf = new Robot().createScreenCapture(panel.bounds());
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Graphics2D graphics2D = imagebuf.createGraphics();
panel.paint(graphics2D);
try {
ImageIO.write(imagebuf,"png", new File(algo.getStr()+".png"));
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("error");
}
}
}
View Code
下面是一我做這個隨機碼圖片生成器的一些些技術細節:
需求:
1、展示:一個界面,點擊生成按鈕就能夠生成一張驗證碼圖片;點擊保存按鈕能夠把圖片保存到當前文件夾;
在一個JPanel中顯示圖片:
JPanel panel = new JPanel(new BorderLayout());
ImageIcon image=new ImageIcon("1.png");
JLabel label=new JLabel("",image,JLabel.CENTER);
panel.add(label,BorderLayout.CENTER);
panel.setBounds(31, 30, 221, 121);
能夠把JFrame存為圖片:
package PictureVerification;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
class MyCanvas extends Canvas{
public void paint(Graphics g) {
Toolkit t=Toolkit.getDefaultToolkit();
Image i=t.getImage("1.png");
g.drawImage(i, 120,100,this);
}
}
class DisplayGraphics extends Canvas{
public void paint(Graphics g) {
int num=(int)(Math.random()*10);
g.drawString(""+num, 10, 10);
//g.drawString("Hello",40,40);
setBackground(Color.WHITE);
g.fillRect(130, 30,100, 80);
g.drawOval(30,130,50, 60);
setForeground(Color.RED);
g.fillOval(130,130,50, 60);
g.drawArc(30, 200, 40,50,90,60);
g.fillArc(30, 130, 40,50,180,40);
}
}
public class Mine extends JFrame {
private JPanel contentPane;
private JFrame f=this;
private JPanel panel;
private JLabel label;
private ImageIcon image;
private BufferedImage imagebuf;
private JButton btnNewButton_1;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Mine frame = new Mine();
//MyCanvas m=new MyCanvas();
JFrame f=frame;
//f.getContentPane().add(m);
//f.setLayout(null);
f.setVisible(true);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Mine() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 301, 256);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JPanel panel = new JPanel(new BorderLayout());
ImageIcon image=new ImageIcon("");
label=new JLabel("",image,JLabel.CENTER);
panel.add(label,BorderLayout.CENTER);
panel.setBounds(31, 30, 221, 121);
contentPane.add(panel);
JButton btnNewButton = new JButton("generate");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
loadImage();
}
});
btnNewButton.setBounds(56, 174, 93, 23);
contentPane.add(btnNewButton);
btnNewButton_1 = new JButton("save");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
saveImage();
}
});
btnNewButton_1.setBounds(159, 174, 93, 23);
contentPane.add(btnNewButton_1);
}
private void loadImage(){
image=new ImageIcon("1.png");
label.setIcon(image);
}
private void saveImage(){
//imagebuf = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
BufferedImage imagebuf=null;;
try {
imagebuf = new Robot().createScreenCapture(
new Rectangle( getX(), getY(), getWidth(), getHeight() ) );
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Graphics2D graphics2D = imagebuf.createGraphics();
paint(graphics2D);
System.out.println("before save");
try {
ImageIO.write(imagebuf,"jpeg", new File("save1.jpeg"));
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("error");
}
}
}
View Code
保存單個JPanel:
private void saveImage(){
BufferedImage imagebuf=null;;
try {
imagebuf = new Robot().createScreenCapture(panel.bounds());
} catch (AWTException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Graphics2D graphics2D = imagebuf.createGraphics();
panel.paint(graphics2D);
try {
ImageIO.write(imagebuf,"jpeg", new File("save1.jpeg"));
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("error");
}
}
View Code
2、生成算法:返回值為Image
(1)直接的純文本
可以設置字體,大小,顏色
(2)純文本加噪聲
加線條
(3)調整大小方位
旋轉
(4)使用矩陣變換進行扭曲
仿射變化
java中的robot類
Image轉BufferedImage
BufferedImage image = ImageIO.read(new File(filename));
public static BufferedImage toBufferedImage(Image img)
{
if (img instanceof BufferedImage)
{
return (BufferedImage) img;
}
// Create a buffered image with transparency
BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
// Draw the image on to the buffered image
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();
// Return the buffered image
return bimage;
}
旋轉繪圖:
BufferedImage imagebuf=ImageIO.read(new File("test2.png"));
Graphics2D g=imagebuf.createGraphics();
g.rotate(0.5, 50, 25);
g.drawString("hello", 100,50);
ImageIO.write(imagebuf,"png", new File("test22.png"));
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Test {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedImage imagebuf=new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
Graphics2D g=imagebuf.createGraphics();
g.drawString("hello", 80,120);
AffineTransform transtate=new AffineTransform();
transtate.translate(18,10);
AffineTransform scale=AffineTransform.getScaleInstance(300/100, 350/50);
AffineTransform tx=g.getTransform();
tx.concatenate(scale);
tx.concatenate(transtate);
g.setTransform(tx);
g.drawString("hello", 10,5);
g.rotate(Math.PI, 10, 5);
g.drawString("hello", 10,5);
ImageIO.write(imagebuf,"png", new File("test22.png"));
}
}
View Code
圖片的仿射變化:http://docs.geotools.org/stable/userguide/tutorial/affinetransform.html#
可以翻轉,移動縮放圖片。
關鍵技術就是這些,最完后就是上面的樣子。
最后介紹一個開源的驗證碼項目:http://jcaptcha.sourceforge.net/
總結
- 上一篇: ERP成本计算
- 下一篇: 问题:https与http有什么区别啊?