Java绘制验证码

package cn;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;

/**
 * @Description:
 * @Author :小书包
 * @CreateDate :2018-12-17 11:52
 */
public class CodeUtil {
    private static Random random = new Random();
    private final static int IMG_WIDTH = 300;// 定义图片的width
    private final static int IMG_HEIGHT = 60;// 定义图片的height
    private final static int CODE_COUNT = 4;// 定义图片上显示验证码的个数
    private final static int X_OFFSET = IMG_WIDTH / CODE_COUNT;//X轴的偏移量
    private final static int FONT_SIZE = IMG_WIDTH / 6;//字体大小
    private final static int Y_OFFSET = FONT_SIZE - random.nextInt(IMG_HEIGHT - FONT_SIZE);//Y轴的偏移量
    private final static char[] CODE_SEQUENCE = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
    private final static int DISTURB_LINE_NUM = 30;//干扰线条数
    
    /**
     * 初始化图像
     */
    public static Graphics initGraphics(BufferedImage buffImg) {
        // 定义图像
        Graphics gd = buffImg.getGraphics();
        // 将图像填充为白色
        gd.setColor(Color.WHITE);
        gd.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
        
        // 创建字体,字体的大小应该根据图片的高度来定。
        Font font = new Font("Fixedsys", Font.BOLD, FONT_SIZE);
        // 设置字体。
        gd.setFont(font);
        
        // 画边框。
        gd.setColor(Color.BLACK);
        gd.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGHT - 1);
        return gd;
        
    }
    
    /**
     * 绘制文本
     */
    private static char[] drawString(Graphics gd) {
        char[] code = new char[CODE_COUNT];
        // 随机产生codeCount数字的验证码。
        for (int i = 0; i < CODE_COUNT; i++) {
            // 得到随机产生的验证码数字。
            // 用随机产生的颜色将验证码绘制到图像中。
            gd.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            code[i] = CODE_SEQUENCE[random.nextInt(CODE_SEQUENCE.length)];
            gd.drawChars(code, i, 1, i * X_OFFSET, Y_OFFSET);
        }
        return code;
    }
    
    /**
     * 绘制干扰线条
     */
    private static void drawDisturbLines(Graphics gd) {
        Graphics2D graphics2D = (Graphics2D) gd;
        // 随机产生若干条干扰线,使图象中的认证码不易被其它程序探测到。
        for (int i = 0; i < DISTURB_LINE_NUM; i++) {
            graphics2D.setStroke(new BasicStroke(random.nextFloat() * 5));
            graphics2D.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
            // 起始点位置,终止点位置
            graphics2D.drawLine(random.nextInt(IMG_WIDTH), random.nextInt(IMG_HEIGHT),
                    random.nextInt(IMG_WIDTH * 2), random.nextInt(IMG_HEIGHT * 2));
        }
    }
    
    /**
     * 保存图片到本地
     */
    private static void saveImg(BufferedImage buffImg, BufferedOutputStream out) {
        File file = new File("D://img/" + System.currentTimeMillis() + ".png");
        if (!file.getParentFile().exists())
            file.getParentFile().mkdirs();
        //创建文件输出流对象
        try {
            out = new BufferedOutputStream(new FileOutputStream(file));
            ImageIO.write(buffImg, "png", out);
        } catch (IOException e) {
            System.out.println("保存图片失败!");
        }
    }
    
    public static void main(String[] args) {
        long startTime;
        BufferedImage buffImg = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_RGB);
        BufferedOutputStream out = null;
        Graphics gd;
        for (int i = 0; i < 100; i++) {
            startTime = System.currentTimeMillis();
            gd = CodeUtil.initGraphics(buffImg);
            System.out.println("初始化消耗了:" + (System.currentTimeMillis() - startTime) + "ms!");
            
            startTime = System.currentTimeMillis();
            drawDisturbLines(gd);
            System.out.println("绘制干扰线条消耗了:" + (System.currentTimeMillis() - startTime) + "ms!");
            
            startTime = System.currentTimeMillis();
            char[] code = drawString(gd);
            System.out.println("绘制" + new String(code) + "文本消耗了:" + (System.currentTimeMillis() - startTime) + "ms!");
            
            startTime = System.currentTimeMillis();
            saveImg(buffImg, out);
            System.out.println("保存图片消耗了:" + (System.currentTimeMillis() - startTime) + "ms!");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32409957/article/details/85049417