Kotlin如何生成验证码?

验证码在Web应用中使用非常广泛,比如登录、发布内容等,这篇文章就介绍下如何使用Java和Kotlin生成验证码图片

在代码中用到了java-helpers中生成随机数, 生成随机字符串的方法。java-helpers可以关注我的公众号回复1获取

目录

  • 最终效果
  • 生成随机验证码字符串
  • 设置图片大小和保存位置
  • 在内存中初始化一张图片
  • 生成随机颜色的方法
  • 生成干扰点
  • 画验证码文本
  • 画干扰线
  • 释放资源
  • 生成图片
  • 完整代码
  • Java
  • Kotlin

最终效果

Java/Kotlin如何生成验证码?

生成随机验证码字符串

Java

//生成6位随机字符串,包含数字
final String answer = RandomHelper.letter(6, true);

Kotlin

val answer = RandomHelper.letter(6, true)

设置图片大小和保存位置

Java

final int height = 50;
final int width = 140;
final File saveFile = new File("保存路径");

Kotlin

val height = 50
val width = 140
val saveFile = File("保存路径")

在内存中初始化一张图片

Java

//在内存中实例化 BufferedImage 对象
final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
final Graphics g = image.getGraphics();
//设置背景色为白色
g.setColor(Color.WHITE);
//填充背景
g.fillRect(0, 0, width, height);

Kotlin

//在内存中实例化 BufferedImage 对象
val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)
val g = image.graphics
//设置背景色为白色
g.color = Color.WHITE
//填充背景
g.fillRect(0, 0, width, height)

生成随机颜色的方法

Java

static Color randColor() {
return new Color(
RandomHelper.integer(50, 200),
RandomHelper.integer(50, 200),
RandomHelper.integer(50, 200)
);
}

生成干扰点

Java

//画500个干扰点
for (int i = 0; i < 500; i++) {
//随机生成干扰点的x坐标, 范围在[0,width]
final int x = RandomHelper.integer(0, width);
//随机生成干扰点的y坐标, 范围在[0,height]
final int y = RandomHelper.integer(0, height);
//随机生成干扰点颜色
g.setColor(randColor());
//画一个像素长的线做为干扰点
g.drawLine(x, y, x, y);
}

Kotlin

//画500个干扰点
for (i in 0 until 500) {
//随机生成干扰点的x坐标, 范围在[0,width]
val x = RandomHelper.integer(0, width)
//随机生成干扰点的y坐标, 范围在[0,height]
val y = RandomHelper.integer(0, height)
//随机生成干扰点颜色
g.color = randColor()
//画一个像素长的线做为干扰点
g.drawLine(x, y, x, y)
}

画验证码文本

Java

//画验证码
for (int i = 0; i < answer.length(); i++) {
//随机生成在30到50之间的字体大小
final int fontSize = RandomHelper.integer(30, 50);
g.setColor(randColor());
g.setFont(new Font("字体名", Font.PLAIN, fontSize));
g.drawString(answer.charAt(i) + "", 20 * i + 10, RandomHelper.integer(35, 45));
}

Kotlin

//画验证码
answer.forEach {
//随机生成在30到50之间的字体大小
final int fontSize = RandomHelper.integer(30, 50)
g.color = randColor()
g.font = Font("字体名", Font.PLAIN, fontSize)
g.drawString(it + "", 20 * i + 10, RandomHelper.integer(35, 45))
}

画干扰线

Java

//画10条干扰线
for (int i = 0; i < 10; i++) {
g.setColor(randColor());
//随机设置线的起终点和颜色
g.drawLine(
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1),
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1)
);
}

Kotlin

//画10条干扰线
for (i in 0 until 10) {
g.color = randColor();
//随机设置线的起终点和颜色
g.drawLine(
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1),
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1)
);
}

释放资源

Java/Kotlin

//释放资源
g.dispose();

生成图片

Java/Kotlin

ImageIO.write(image,"png",saveFile);

完整代码

Java

import link.hefang.helpers.RandomHelper;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
//生成6位随机字符串,包含数字
final String answer = RandomHelper.letter(6, true);
final int height = 50;
final int width = 140;
final File saveFile = new File("captcha.png");
//在内存中实例化 BufferedImage 对象
final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
final Graphics g = image.getGraphics();
//设置背景色为白色
g.setColor(Color.WHITE);
//填充背景
g.fillRect(0, 0, width, height);
//画500个干扰点
for (int i = 0; i < 500; i++) {
//随机生成干扰点的x坐标, 范围在[0,width]
final int x = RandomHelper.integer(0, width);
//随机生成干扰点的y坐标, 范围在[0,height]
final int y = RandomHelper.integer(0, height);
//随机生成干扰点颜色
g.setColor(randColor());
//画一个像素长的线做为干扰点
g.drawLine(x, y, x, y);
}
//画验证码
for (int i = 0; i < answer.length(); i++) {

//随机生成在30到50之间的字体大小
final int fontSize = RandomHelper.integer(30, 50);
g.setColor(randColor());
g.setFont(new Font("Consolas", Font.PLAIN, fontSize));
g.drawString(answer.charAt(i) + "", 20 * i + 10, RandomHelper.integer(35, 45));
}
//画10条干扰线
for (int i = 0; i < 10; i++) {
g.setColor(randColor());
//随机设置线的起终点和颜色
g.drawLine(
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1),
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1)
);
}
//释放资源
g.dispose();
ImageIO.write(image, "png", saveFile);
}
private static Color randColor() {
return new Color(
RandomHelper.integer(50, 200),
RandomHelper.integer(50, 200),
RandomHelper.integer(50, 200)
);
}
}

Kotlin

import link.hefang.helpers.RandomHelper
import java.awt.Color
import java.awt.Font
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO
//在Kotlin中不需要Main类, 只要一个main函数就可以了
fun main(args: Array<string>) {
//生成6位随机字符串,包含数字
val answer = RandomHelper.letter(6, true)
val height = 50

val width = 140
val saveFile = File("captcha-kotlin.png")
//在内存中实例化 BufferedImage 对象
val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)
val g = image.graphics
//设置背景色为白色
g.color = Color.WHITE
//填充背景
g.fillRect(0, 0, width, height)
//画500个干扰点
for (i in 0 until 500) {
//随机生成干扰点的x坐标, 范围在[0,width]
val x = RandomHelper.integer(0, width)
//随机生成干扰点的y坐标, 范围在[0,height]
val y = RandomHelper.integer(0, height)
//随机生成干扰点颜色
g.color = randColor()
//画一个像素长的线做为干扰点
g.drawLine(x, y, x, y)
}
//画验证码
for (i in 0 until answer.length) {
//随机生成在30到50之间的字体大小
val fontSize = RandomHelper.integer(30, 50)
g.color = randColor()
g.font = Font("Consolas", Font.PLAIN, fontSize)
g.drawString(answer[i] + "", 20 * i + 10, RandomHelper.integer(35, 45))
}
//画10条干扰线
for (i in 0 until 10) {
g.color = randColor()
//随机设置线的起终点和颜色
g.drawLine(
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1),
RandomHelper.integer(-1, width + 1),
RandomHelper.integer(-1, height + 1)
)
}

//释放资源
g.dispose()
ImageIO.write(image, "png", saveFile)
}
fun randColor(): Color {
return Color(
RandomHelper.integer(50, 200),
RandomHelper.integer(50, 200),
RandomHelper.integer(50, 200)
)
}
/<string>

这样就可以用Java或Kotlin直接生成验证码图片了, 以后我会再写一个Kotlin的系统教程欢迎大家关注学习。


分享到:


相關文章: