javaEE - 动态生成验证码图片

兄弟们你们的福音来了,今天我给你们准备了一个大餐,动态生成验证码图片
家人们,请笑纳

package sdpei.huxuehao.util;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

import com.sun.prism.Image;
/**
 * @Description  这是一个工具类,用于生成动态验证码图片
 * @author HuXuehao  Email:
 * @version
 * @date 2020年10月23日上午10:59:48
 */
public class VerifyCode {
	private int w =70;  //设置图片的宽
	private int h =35;  //设置图片的高
	private Random r = new Random();  //创建一个随机生成的对象
	
	//设置字体
	private String[] fontName = {"宋体","华文楷体","黑体","华文新魏","华文隶书","微软雅黑_GB2312"};
	private String codes ="23456789abcdefghjkmnpqstuvwsyzABCDEFGHKMNPQSTUVTSYZ"; //设置验证码的候选值
	private Color bgColor = new Color(255,255,255); //设置图片背景颜色
	private String text; //保存验证码
	
	//随机生成字体的颜色
	private Color randomColor() {
		int red=r.nextInt(150); //因为底色是白色所以不能让他=它的颜色太接近白素
		int green= r.nextInt(150);
		int blue = r.nextInt(150);
		return new Color(red,green,blue); 
	}
	
	//随机生成字体
	private Font randomFont() {
		int index = r.nextInt(fontName.length);
		String fonName = fontName[index];  //随机生成字体
		int style = r.nextInt(4);//生成字体的样式[0-4),0表示无样式,1表示粗体,2表示斜体,3表示粗体加斜体
		int size = r.nextInt(50); //设置字体放入大小[0-50)
		if(size<20) {
			size +=10;
			System.out.println(size);
		}
		return new Font(fonName,style,size);//
	}
	
	//生成3条干扰线
	private void drawLine(BufferedImage image) {
		int num =3; //生成3条干扰线
		Graphics2D 	g2 = (Graphics2D)image.getGraphics();
		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 char randomChar() {
		int index = r.nextInt(codes.length());
		return codes.charAt(index);
	}
	
	//创建BufferedImage
	private BufferedImage createImage() {
		BufferedImage image  = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);
		Graphics2D 	g2 = (Graphics2D)image.getGraphics(); //得到一个绘制环境
		g2.setColor(this.bgColor);
		g2.fillRect(0, 0, w, h);
		return image;
	}
	
	//调用这个方法的倒验证码图片
	public BufferedImage getImage() {
		BufferedImage image = createImage(); //生成图片缓冲区
		Graphics2D 	g2 = (Graphics2D)image.getGraphics(); //得到一个绘制环境
		StringBuilder sb =new StringBuilder(); //装载验证码中的文本
		for(int i =0;i<4;i++) { //向图片中画入4个字符
			String s= randomChar()+""; //随机生成一个字符
			sb.append(s);  //把字符添加到sb中
			float x = i*1.0F*w/4;  //设置当前字符的x坐标
			g2.setFont(randomFont()); //随机设置字体
			g2.setColor(randomColor()); //随机生成颜色
			g2.drawString(s, x, h-5); //画图
		}
		this.text = sb.toString(); //将生成的4位字符装入text中
		drawLine(image);  //添加干扰线
		return image;  
	}
	
	//获取验证码文本
	public String getText() {
		return text;  
	}
	
	//保存图片到指定输出流
	public static void output(BufferedImage image,OutputStream out) throws IOException {
		ImageIO.write(image, "JPEG", out);
	}
//---------------------------------------------------------------------------------------
//	使用方法
	public static void main(String[] args) {
		VerifyCode verifyCode = new VerifyCode(); //首先定义一个verifyCode对象
		BufferedImage image = verifyCode.getImage();  //调用得到图片验证码的方法
		String text2 = verifyCode.getText();  //获取到文本,用于后端的校验
		System.out.println(text2);
		try {
//			将得到的图片传的指定的位置,注意这个方法抛异常,所以要用try-catch接收处理一下
			verifyCode.output(image, new FileOutputStream("E:/08图片/code1.jpg")); 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值