【验证码】使用Java生成验证码,随机生成的长度不少于4位的字符,应包含字母与数字,并在显示时对其进行扭曲处理,提高识别的难度
- 工作小总结
- 时间:2023-06-12 11:33
- 2528人已阅读
简介
需求:随机生成的长度不少于4位的字符,应包含字母与数字,并在显示时对其进行扭曲处理,提高识别的难度效果:这是上一篇文章中介绍的方案,但是,这种验证码过于简单。不能满足需求,修改后效果如下:完整代码:import javax.imageio.ImageIO;import java.awt.*;import java.awt.geom.AffineTransform;im
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
需求:
随机生成的长度不少于4位的字符,应包含字母与数字,并在显示时对其进行扭曲处理,提高识别的难度
效果:

这是上一篇文章中介绍的方案,但是,这种验证码过于简单。不能满足需求,修改后效果如下:

完整代码:
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.security.SecureRandom;
public class DistortedText {
public static void main(String[] args) {
int width = 200;
int height = 80;
int codeLength = 4;
String randomString = generateRandomString(codeLength);
String filename = "distorted_text.png";
drawDistortedText(width, height, randomString, filename);
}
private static String generateRandomString(int length) {
String lettersAndDigits = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder sb = new StringBuilder();
SecureRandom random = new SecureRandom();
for (int i = 0; i < length; i++) {
sb.append(lettersAndDigits.charAt(random.nextInt(lettersAndDigits.length())));
}
return sb.toString();
}
private static void drawDistortedText(int width, int height, String text, String filename) {
SecureRandom random = new SecureRandom();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
// 设置抗锯齿
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 填充背景颜色
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
Font font = new Font("Arial", Font.BOLD, 28);
g2d.setFont(font);
int fontSize = font.getSize();
int charWidth = width / text.length();
// 绘制字符串,并进行扭曲
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
// 随机颜色
Color color = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256));
g2d.setColor(color);
// 扭曲变换
double angle = random.nextInt(60) - 30;
double x = i * charWidth + charWidth / 2.0;
double y = height / 2.0 + fontSize / 2.0 - 10;
AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(angle), x, y);
g2d.setTransform(transform);
g2d.drawChars(new char[]{c}, 0, 1, (int) x, (int) y);
g2d.setTransform(new AffineTransform());
}
// 添加随机干扰线
g2d.setColor(Color.GRAY);
for (int i = 0; i < 4; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
g2d.drawLine(x1, y1, x2, y2);
}
// 添加随机噪点
float noiseDensity = 0.05f;
int numPixels = (int)(noiseDensity * width * height);
for (int i = 0; i < numPixels; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int rgb = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)).getRGB();
image.setRGB(x, y, rgb);
}
// 保存为文件
try {
ImageIO.write(image, "png", new File(filename));
} catch (IOException e) {
e.printStackTrace();
}
}
}本文相当于上一篇,做的修改如下:
它使用多个扭曲变换和随机颜色进行绘制来增加验证码的难度。上述代码中,我们为每个字符设置了不同的颜色,并使用多个不同的旋转角度进行扭曲变换。我们还添加了随机的干扰线和噪点来提高