简介:
随机验证码为随机字体和大小的数字或字母的组合,长度为4,有干扰线。
代码:
package demoClass;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import org.junit.Test;
public class Verify {
// 画布的宽
private int w = 70;
// 画布的高
private int h = 35;
// 字体格式
private String[] fontStyle = {"宋体","华文楷体","黑体","微软雅黑","仿宋体"};
// 创建一个随机数生成器
private Random r = new Random();
// 验证码
private String code = "234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKKLMNPQRSTUVWXYZ";
// 背景色
private Color bgColor = new Color(255,255,255); // 白色
// 验证码的文本
private String text;
// 生成随机颜色
private Color randomColor() {
int red = r.nextInt(150);
int blue = r.nextInt(150);
int green = r.nextInt(150);
return new Color(red, green, blue);
}
// 生成随机字体
private Font randomFont() {
int index = r.nextInt(fontStyle.length);
String font = fontStyle[index];
int style = r.nextInt(4);
int size = r.nextInt(5) + 24;
System.out.println("index = " + index + "font = " + font + "style = " + style + "size = " + size);
return new Font(font, style, size);
}
// 画干扰线
private void drawLine(BufferedImage image) {
int num = 3; // 一共画三条干扰线
Graphics2D g2 = image.createGraphics();
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 BufferedImage createImage() {
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bi.createGraphics();
g2.setColor(this.bgColor);
g2.fillRect(0, 0, w, h);
return bi;
}
// 返回code中的一个字符
private char chooseCode() {
int index = r.nextInt(code.length());
return code.charAt(index);
}
// 返回添加干扰线后的验证码图片
public BufferedImage getImage() {
// 创建一个缓冲区
BufferedImage image = createImage();
// 创建2D画布
Graphics2D g2 = image.createGraphics();
// 创建一个字符串接收器
StringBuffer sb = new StringBuffer();
// 向图片中画4个字符
for (int i = 0; i < 4; i++) {
String s = chooseCode() + "";
sb.append(s);
float x = i * 1.0F * w/4; // x坐标
g2.setFont(randomFont()); // 设置字体
g2.setColor(randomColor()); // 设置颜色
g2.drawString(s, x, h-10); // 画图
}
this.text = sb.toString(); // 把生成的字符文本赋值给text
drawLine(image); // 添加干扰线
return image;
}
// 获取文本
public String getText() {
return this.text;
}
// 保存图片到指定位置
public static void output(BufferedImage image, OutputStream out) throws IOException {
ImageIO.write(image, "JPEG", out);
}
}
测试效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)