生成验证码

来源:互联网 发布:剑三脸型数据非法 编辑:程序博客网 时间:2024/06/05 14:21
import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.util.Random;import javax.imageio.ImageIO;public class VerifyCode {    private int width=70;    private int height=35;    private Random r=new Random();    //可选字体样式    private String[] fontNames={"宋体","华文楷体","黑体","微软雅黑","楷体_GB2312"};    //可选字符    private String codes="23456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";    //背景色    private Color bgcolor=new Color(255,255,255);    private String text;    //生成随机的颜色    private Color randomColor(){        int red=r.nextInt(150);        int green=r.nextInt(150);        int blue=r.nextInt(150);        return new Color(red,green,blue);    }    //生成随机的字体    private Font randomFont(){        int index=r.nextInt(fontNames.length);        String fontName=fontNames[index];  //生成随机的字体名称        int style=r.nextInt(4); //生成随机样式,0(无样式),1(粗体),2(斜体),3(粗体+斜体)        int size=r.nextInt(5)+24; //生成随机字号,24~28        return new Font(fontName,style,size);    }    //画干扰线    private void drawLine(BufferedImage image){        int num=3;  //一共画3条        Graphics2D g2 = (Graphics2D)image.getGraphics();        for(int i=0;i<num;i++){   //划线之前,首先确定两个点            int x1=r.nextInt(width);            int y1=r.nextInt(height);            int x2=r.nextInt(width);            int y2=r.nextInt(height);            g2.setStroke(new BasicStroke(1.5F));            g2.setColor(Color.blue);//干扰线是蓝色的            g2.drawLine(x1, y1, x2, y2);//画线        }               }    //随机生成一个字符    private char randomChar(){        int index=r.nextInt(codes.length());        return codes.charAt(index);    }    //创建一个BufferedImage    private BufferedImage createImage(){        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);        Graphics2D g2 = (Graphics2D)image.getGraphics();  //得到绘画环境(画笔)        g2.setColor(this.bgcolor); //设置绘画环境的颜色        g2.fillRect(0,0,width,height);  //给绘画环境填充一个矩形        return image;    }    public BufferedImage getImage(){        BufferedImage image=createImage();   //创建图片缓冲区        Graphics2D g2=(Graphics2D)image.getGraphics();//得到绘制环境        StringBuffer sb=new StringBuffer();//用来装载生成的验证码文本        //向图片中画4个字符        for(int i=0;i<4;i++){            String s=randomChar()+""; //随机生成一个字母            sb.append(s);   //把字母添加到sb中            float x=i*1.0F*width/4;  //将图片分为4分,x为每4分的左上起点            g2.setFont(randomFont());//设置随机字体            g2.setColor(randomColor());//设置随机颜色            g2.drawString(s, x,height-5);//画图        }        this.text=sb.toString(); //把生成的字符赋给了this.text        drawLine(image);//添加干扰线        return image;    }    //返回验证码图片上的文本    public String getText(){        return text;    }    //保存图片到指定的输出流    public static void output(BufferedImage image,OutputStream out) throws IOException{        ImageIO.write(image, "JPEG", out);    } }
原创粉丝点击