随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

简介:

随机验证码为随机字体和大小的数字或字母的组合,长度为4,有干扰线。

代码:

package demoClass;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
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;

import org.junit.Test;

public class Verify {
    // 画布的宽
    private int w = 70;
    // 画布的高
    private int h = 35;
    // 字体格式
    private String[] fontStyle = {"宋体","华文楷体","黑体","微软雅黑","仿宋体"};
    // 创建一个随机数生成器
    private Random r = new Random();
    // 验证码
    private String code = "234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKKLMNPQRSTUVWXYZ";
    // 背景色
    private Color bgColor = new Color(255,255,255);    // 白色
    // 验证码的文本
    private String text;
    
    // 生成随机颜色
    private Color randomColor() {
        int red = r.nextInt(150);
        int blue = r.nextInt(150);
        int green = r.nextInt(150);
        return new Color(red, green, blue);
    }
    
    // 生成随机字体
    private Font randomFont() {
        int index = r.nextInt(fontStyle.length);
        String font = fontStyle[index];
        int style = r.nextInt(4);
        int size = r.nextInt(5) + 24;
        System.out.println("index = " + index + "font = " + font + "style = " + style + "size = " + size);
        return new Font(font, style, size);
    }
    
    // 画干扰线
    private void drawLine(BufferedImage image) {
        int num = 3; // 一共画三条干扰线
        Graphics2D g2 = image.createGraphics();
        for(int i = 0; i < num; i++) {
            // 绘制一条线要两个点,两个点要分别有x,y坐标
            int x1 = r.nextInt(w);    
            int y1 = r.nextInt(h);
            int x2 = r.nextInt(w);
            int y2 = r.nextInt(h);
            g2.setStroke(new BasicStroke(1.5F));    // 干扰线粗细的
            g2.setColor(Color.BLUE);    // 干扰线的颜色
            g2.drawLine(x1, y1, x2, y2);    // 绘制干扰线
        }
        
    }
    
    // 创建图片缓冲区
    private BufferedImage createImage() {
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bi.createGraphics();
        g2.setColor(this.bgColor);
        g2.fillRect(0, 0, w, h);
        return bi;
    }
    
    // 返回code中的一个字符
    private char chooseCode() {
        int index = r.nextInt(code.length());
        return code.charAt(index);
    }
    
    // 返回添加干扰线后的验证码图片
    public BufferedImage getImage() {
        // 创建一个缓冲区
        BufferedImage image = createImage();
        // 创建2D画布
        Graphics2D g2 = image.createGraphics();
        // 创建一个字符串接收器
        StringBuffer sb = new StringBuffer();
        // 向图片中画4个字符
        for (int i = 0; i < 4; i++) {
            String s = chooseCode() + "";
            sb.append(s);
            float x = i * 1.0F * w/4;    // x坐标
            g2.setFont(randomFont());    // 设置字体
            g2.setColor(randomColor());    // 设置颜色
            g2.drawString(s, x, h-10);     // 画图
        }
        this.text = sb.toString();    // 把生成的字符文本赋值给text
        drawLine(image);    // 添加干扰线
        return image;
    }
    
    // 获取文本
    public String getText() {
        return this.text;
    }
    
    // 保存图片到指定位置
    public static void output(BufferedImage image, OutputStream out) throws IOException {
        ImageIO.write(image, "JPEG", out);
        
    }
}

测试效果:

 

posted on 2022-04-22 17:43  时间完全不够用啊  阅读(127)  评论(0编辑  收藏  举报