From fa79eee1ce741ab0aa1c3a8bf577b6d9d42c0cb1 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 14 Jan 2026 11:51:56 +0800 Subject: [PATCH] =?UTF-8?q?`AbstractCaptcha`=E5=A2=9E=E5=8A=A0`setStroke`?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81=E7=BA=BF=E6=9D=A1=E7=B2=97?= =?UTF-8?q?=E7=BB=86=EF=BC=88issue#IDJQ15@Gitee=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../java/cn/hutool/captcha/AbstractCaptcha.java | 15 +++++++++++---- .../java/cn/hutool/captcha/CircleCaptcha.java | 5 +++++ .../main/java/cn/hutool/captcha/LineCaptcha.java | 5 +++++ .../main/java/cn/hutool/captcha/ShearCaptcha.java | 1 - 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 392ebecbea..b4d61f7d6c 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ # 5.8.44(2026-01-12) ### 🐣新特性 * 【core 】 `NumberUtil.parseNumber`增加支持科学计数法(pr#4211@Github) +* 【captcha】 `AbstractCaptcha`增加`setStroke`方法支持线条粗细(issue#IDJQ15@Gitee) ### 🐞Bug修复 * 【json 】 修复`JSONUtil.wrap`忽略错误问题(issue#4210@Github) diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java index adb48c32ec..4790d8dc3a 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java @@ -9,10 +9,7 @@ import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.URLUtil; -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Font; -import java.awt.Image; +import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; @@ -65,6 +62,7 @@ public abstract class AbstractCaptcha implements ICaptcha { * 文字透明度 */ protected AlphaComposite textAlpha; + protected Stroke stroke; /** * 构造,使用随机验证码生成器生成验证码 @@ -271,4 +269,13 @@ public abstract class AbstractCaptcha implements ICaptcha { this.textAlpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, textAlpha); } + /** + * 设置画笔线条特征,如线条宽度等 + * + * @param stroke 画笔 + * @since 5.8.44 + */ + public void setStroke(Stroke stroke) { + this.stroke = stroke; + } } diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java index f528cf359e..71ec724512 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java @@ -118,6 +118,11 @@ public class CircleCaptcha extends AbstractCaptcha { * @param g {@link Graphics2D} */ private void drawInterfere(Graphics2D g) { + // issue#IDJQ15 自定义线条特征(粗细等) + if(null != this.stroke){ + g.setStroke(this.stroke); + } + final ThreadLocalRandom random = RandomUtil.getRandom(); for (int i = 0; i < this.interfereCount; i++) { diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java index a4d556da42..f5d8e37c1f 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java @@ -110,6 +110,11 @@ public class LineCaptcha extends AbstractCaptcha { * @param g {@link Graphics2D}画笔 */ private void drawInterfere(Graphics2D g) { + // issue#IDJQ15 自定义线条特征(粗细等) + if(null != this.stroke){ + g.setStroke(this.stroke); + } + final ThreadLocalRandom random = RandomUtil.getRandom(); // 干扰线 for (int i = 0; i < this.interfereCount; i++) { diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java index f0c2a14824..6703983582 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java @@ -193,7 +193,6 @@ public class ShearCaptcha extends AbstractCaptcha { */ @SuppressWarnings("SameParameterValue") private void drawInterfere(Graphics g, int x1, int y1, int x2, int y2, int thickness, Color c) { - // The thick line is in fact a filled polygon g.setColor(c); int dX = x2 - x1;