博客详情

java中生成图形验证码 (原创)

作者: 朝如青丝暮成雪
发布时间:2021-07-29 07:32:28  文章分类:java编程   阅读(782)  评论(0)


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文件,即是随机生成的图形验证码。

 、   、



关键字:  图形验证码  java
评论信息
暂无评论
发表评论

亲,您还没有登陆,暂不能评论哦! 去 登陆 | 注册

博主信息
   
数据加载中,请稍候...
文章分类
   
数据加载中,请稍候...
阅读排行
 
数据加载中,请稍候...
评论排行
 
数据加载中,请稍候...

Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1

鄂公网安备 42011102000739号