兄弟们你们的福音来了,今天我给你们准备了一个大餐,动态生成验证码图片
家人们,请笑纳
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();
}
}
}