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的系統教程歡迎大家關注學習。


分享到:


相關文章: