java生成图形验证码

该博客介绍了如何使用Java实现图形验证码的生成,包括设置验证码的宽度、高度、字符个数和干扰线条数,使用随机数生成颜色和线条,并从自定义字体库中选择字符。同时,给出了测试代码来验证生成的验证码并将其保存为PNG图片。
摘要由CSDN通过智能技术生成

1、VerifyCode 验证码类

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
 
 
/**
 * 验证码生成器
 */ 
public class ValidateCode { 
   
    // 图片的宽度。 
    private int width = 160; 
    // 图片的高度。 
    private int height = 40; 
    // 验证码字符个数 
    private int codeCount = 5; 
    // 验证码干扰线数 
    private int lineCount = 150; 
    // 验证码 
    private  String code = null; 
    // 验证码图片Buffer 
    private BufferedImage buffImg=null; 
       
       
    private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L',  
    'M', 'N',  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X', 'Y',  
    'Z',  '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
       
       
    public  ValidateCode() { 
        this.createCode(); 
    } 
       
       
    /**
    * 
    * @param width 图片宽
    * @param height 图片高
    */ 
    public  ValidateCode(int width,int height) {
    this.width=width;
    this.height=height;
    this.createCode();
    }
           
    /**
    * 
    * @param width 图片宽
    * @param height 图片高
    * @param codeCount 字符个数
    * @param lineCount 干扰线条数
    */ 
    public  ValidateCode(int width,int height,int codeCount,int lineCount) { 
        this.width=width; 
        this.height=height; 
        this.codeCount=codeCount; 
        this.lineCount=lineCount; 
        this.createCode(); 
    } 
       
    public void createCode() { 
        int x = 0,fontHeight=0,codeY=0; 
        int red = 0, green = 0, blue = 0; 
       
        x = width / (codeCount +2);//每个字符的宽度 
        fontHeight = height - 2;//字体的高度 
        codeY = height - 4; 
           
        // 图像buffer 
        buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); 
        Graphics2D g = buffImg.createGraphics(); 
        // 生成随机数 
        Random random = new Random(); 
        // 将图像填充为白色 
        g.setColor(Color.WHITE); 
        g.fillRect(0, 0, width, height); 
        // 创建字体 
        ImgFontByte imgFont=new ImgFontByte();
         
        Font font =imgFont.getFont(fontHeight); 
        g.setFont(font); 
           
        for (int i = 0; i < lineCount; i++) { 
        int xs = random.nextInt(width); 
        int ys = random.nextInt(height); 
        int xe = xs+random.nextInt(width/8); 
        int ye = ys+random.nextInt(height/8); 
        red = random.nextInt(255); 
        green = random.nextInt(255); 
        blue = random.nextInt(255); 
        g.setColor(new Color(red, green, blue)); 
        g.drawLine(xs, ys, xe, ye); 
      } 
    // randomCode记录随机产生的验证码 
    StringBuffer randomCode = new StringBuffer(); 
        // 随机产生codeCount个字符的验证码。 
        for (int i = 0; i < codeCount; i++) { 
        String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]); 
        // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。 
        red = random.nextInt(255); 
        green = random.nextInt(255); 
        blue = random.nextInt(255); 
        g.setColor(new Color(red, green, blue)); 
        g.drawString(strRand, (i + 1) * x, codeY); 
        // 将产生的四个随机数组合在一起。 
        randomCode.append(strRand); 
        } 
        // 将四位数字的验证码保存到Session中。 
        code = randomCode.toString(); 
    } 
       
    public void write(String filePath) throws IOException {
        OutputStream out = new FileOutputStream(filePath);
        this.write(out); 
    } 
       
    public void write(OutputStream out) throws IOException { 
        ImageIO.write(buffImg, "png", out); 
        out.close(); 
    } 
       
    public BufferedImage getBuffImg() { 
        return buffImg; 
    } 
       
    public  String getCode() { 
        return code; 
    } 
   
}

2、ImgFontByte 字体类 (可读取自定义ttf文件)

import java.awt.*;
 
/**
 * ttf字体文件
 * @author dsna
 *
 */ 
public class ImgFontByte { 
 
    public Font getFont(int fontHeight){
           // 使用自定义字体
          //  byte[] bytes= FileUtil.readBytes(new File("C:/Windows/Fonts/simsunb.ttf"));
          //  Font baseFont =Font.createFont(Font.TRUETYPE_FONT,new ByteArrayInputStream(bytes));
           // return baseFont.deriveFont(Font.PLAIN, fontHeight);
 
        return new Font("Arial",Font.PLAIN, fontHeight);//默认使用  Arial 字体
    }
}

3、 测试代码 (生成图形验证码)

import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
 
public class ValidateCodeTest {
 
    @Test
    public void test1(){
        try {
            //宽度、高度、字符个数、干扰线条数
            ValidateCode verifyCode = new ValidateCode(120,50,4,20);
            System.out.println("verifyCode值:"+verifyCode.getCode());
            verifyCode.write(new FileOutputStream(new File("d:/vcode.png")));
            System.out.println("ok"); //
        }catch (Exception e){
            e.printStackTrace();
        }
    }
 
}

打开d:/vcode.png文件,即是随机生成的图形验证码图片。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值