Java验证码工具模板

package com.qzh.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Map;
import java.util.Random;


public class CpachaUtil {
	
	//验证码来源
	final private char[] code= {
			'2', '3', '4', '5', '6', '7', '8', '9',
			'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
			'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 
			'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
			'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R',
			'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
	};
	
	//字体
	final private String[] fontNames=new String[]{
		"黑体", "宋体", "Courier", "Arial", 
		"Verdana", "Times", "Tahoma", "Georgia"
	};
	
	//字体样式
	final private int[] fontStyles = new int[]{
			Font.BOLD, Font.ITALIC|Font.BOLD
	};
	
	//验证码长度
	private int vcodeLen=4;
	
	
	//验证码字体大小
	private int fontsize=21;
	
	//验证码图片宽度
	private int width=(fontsize+1)*vcodeLen+10;
	
	//验证码图片高度
	private int height=fontsize+12;
	
	//干扰线条数
	private int disturbline = 3;
	
	public CpachaUtil() {};
	
	//有参构造函数,自定义验证码长度
	public CpachaUtil(int vcodeLen) {
		this.vcodeLen=vcodeLen;
		this.width=(fontsize+1)*vcodeLen+10;
	}
	
	//获得正常验证码图片
	public BufferedImage generatorVcodeImage(String vcode,boolean drawLine) {
		BufferedImage vcodeImage=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics g=vcodeImage.getGraphics();
		//设置颜色
		g.setColor(new Color(246,240,250));
		//填充背景
		g.fillRect(0, 0, width, height);
		//画干扰线
		if(drawLine) {
			drawDisturbLine(g);
		}
		//生成伪随机数
		Random ran=new Random();
		//画验证码
		for(int i=0;i<vcode.length();i++) {
			//设置字体
			g.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize));
			//设置随机颜色
			g.setColor(getRandomColor());
			//画验证码
			g.drawString(vcode.charAt(i)+"", i*fontsize+10, fontsize+5);
		}
		//释放资源
		g.dispose();
		return vcodeImage;
	}
	
	//获得旋转验证码图片
	public BufferedImage generatorRotateVcodeImage(String vcode,boolean drawLine) {
		BufferedImage rotateVcodeImage=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g2d=rotateVcodeImage.createGraphics();
		g2d.setColor(new Color(246, 240, 250));
		g2d.fillRect(0, 0, width, height);
		if(drawLine) {
			drawDisturbLine(g2d);
		}
		for(int i=0;i<vcode.length();i++) {
			//获得旋转字符图片
			BufferedImage rotateImage=getRotateImage(vcode.charAt(i));
			//在图上画旋转字符
			g2d.drawImage(rotateImage, null, (int)(this.height*0.7)*i, 0);
		}
		//释放资源
		g2d.dispose();
		return rotateVcodeImage;
	}
	
	//获得验证码字符串
	public String generatorVcode() {
		int len=code.length;
		Random ran=new Random();
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<vcodeLen;i++) {
			int index=ran.nextInt(len);
			sb.append(code[index]);
		}
		return sb.toString();
	}
	
	//画干扰线
	private void drawDisturbLine(Graphics g) {
		Random ran=new Random();
		for(int i=0;i<disturbline;i++) {
			int x1=ran.nextInt(width);
			int y1=ran.nextInt(height);
			int x2=ran.nextInt(width);
			int y2=ran.nextInt(height);
			g.setColor(getRandomColor());
			g.drawLine(x1, y1, x2, y2);
		}
	}
	
	//获得旋转字符图片
	private BufferedImage getRotateImage(char c) {
		BufferedImage rotateImage=new BufferedImage(height, height, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2d=rotateImage.createGraphics();
		g2d.setColor(new Color(255, 255, 255,0));
		g2d.fillRect(0, 0, height, height);
		Random ran=new Random();
		g2d.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize));
		g2d.setColor(getRandomColor());
		double theta = getTheta();
		g2d.rotate(theta,height/2,height/2);
		g2d.drawString(Character.toString(c), (height-fontsize)/2, fontsize+5);
		g2d.dispose();
		
		return rotateImage;
	}
	
	//获得随机颜色
	private Color getRandomColor() {
		Random ran=new Random();
		return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220));
	}
	
	//获得随机角度
	private double getTheta() {
		return ((int)(Math.random()*1000)%2==0?-1:1)*Math.random();
	}
	
	//设置验证码长度
	public void setVcodeLen(int vcodeLen) {
		this.width = (fontsize+3)*vcodeLen+10;
		this.vcodeLen = vcodeLen;
	}
	
	//获得字体大小
	public int getFontsize() {
		return fontsize;
	}

	//设置字体大小
	public void setFontsize(int fontsize) {
		this.width = (fontsize+3)*vcodeLen+10;
		this.height = fontsize+15;
		this.fontsize = fontsize;
	}
	//图片宽度
	public int getWidth() {
		return width;
	}
	
	//设置图片宽度
	public void setWidth(int width) {
		this.width = width;
	}

	 //图片高度
	public int getHeight() {
		return height;
	}
	
	//设置图片高度
	public void setHeight(int height) {
		this.height = height;
	}
	
	
	//获得干扰线条数
	public int getDisturbline() {
		return disturbline;
	}
	
	 //设置干扰线条数
	public void setDisturbline(int disturbline) {
		this.disturbline = disturbline;
	}
}

你可能感兴趣的:(Java工具模板,java)