From bf7738e6f9d1853f9d3b254790049567dd298e55 Mon Sep 17 00:00:00 2001 From: FRANKSTEIN11 Date: Wed, 3 Apr 2024 22:23:17 +0800 Subject: [PATCH 1/2] fix: add introduction for setOnlyAlias --- hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java index ad387bcfb..8a24bcc65 100755 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelWriter.java @@ -480,6 +480,7 @@ public class ExcelWriter extends ExcelBase { /** * 设置是否只保留别名中的字段值,如果为true,则不设置alias的字段将不被输出,false表示原样输出 + * Bean中设置@Alias时,setOnlyAlias是无效的,这个参数只和addHeaderAlias配合使用,原因是注解是Bean内部的操作,而addHeaderAlias是Writer的操作,不互通。 * * @param isOnlyAlias 是否只保留别名中的字段值 * @return this From 397bcd7341ad2aa60342942d6e413a97dff5b84e Mon Sep 17 00:00:00 2001 From: FRANKSTEIN11 Date: Thu, 4 Apr 2024 23:52:30 +0800 Subject: [PATCH 2/2] feature: add captcha font size --- .../cn/hutool/captcha/AbstractCaptcha.java | 21 +++++- .../java/cn/hutool/captcha/CaptchaUtil.java | 71 +++++++++++++++++-- .../java/cn/hutool/captcha/CircleCaptcha.java | 30 +++++--- .../java/cn/hutool/captcha/GifCaptcha.java | 27 +++++-- .../java/cn/hutool/captcha/LineCaptcha.java | 23 ++++-- .../java/cn/hutool/captcha/ShearCaptcha.java | 14 ++++ .../java/cn/hutool/captcha/CaptchaTest.java | 42 ++++++++++- 7 files changed, 201 insertions(+), 27 deletions(-) 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 85ebcd295..7c4d0ee4c 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/AbstractCaptcha.java @@ -95,6 +95,25 @@ public abstract class AbstractCaptcha implements ICaptcha { this.font = new Font(Font.SANS_SERIF, Font.PLAIN, (int) (this.height * 0.75)); } + + /** + * 构造 + * + * @param width 图片宽 + * @param height 图片高 + * @param generator 验证码生成器 + * @param interfereCount 验证码干扰元素个数 + * @param size 字体的大小 高度的倍数 + */ + public AbstractCaptcha(int width, int height, CodeGenerator generator, int interfereCount, float size) { + this.width = width; + this.height = height; + this.generator = generator; + this.interfereCount = interfereCount; + // 字体高度设为验证码高度-2,留边距 + this.font = new Font(Font.SANS_SERIF, Font.PLAIN, (int) (this.height * size)); + } + @Override public void createCode() { generateCode(); @@ -201,7 +220,7 @@ public abstract class AbstractCaptcha implements ICaptcha { * @return 图片带文件格式的 Base64 * @since 5.3.11 */ - public String getImageBase64Data(){ + public String getImageBase64Data() { return URLUtil.getDataUriBase64("image/png", getImageBase64()); } diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/CaptchaUtil.java b/hutool-captcha/src/main/java/cn/hutool/captcha/CaptchaUtil.java index 752acc979..491e2fb62 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/CaptchaUtil.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/CaptchaUtil.java @@ -47,6 +47,21 @@ public class CaptchaUtil { return new LineCaptcha(width, height, generator, lineCount); } + /** + * 创建线干扰的验证码 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 + * @param lineCount 干扰线条数 + * @param size 字体的大小 高度的倍数 + * @return {@link LineCaptcha} + */ + public static LineCaptcha createLineCaptcha(int width, int height, int codeCount, int lineCount, float size) { + return new LineCaptcha(width, height, codeCount, lineCount, size); + } + // ------------------------- lineCaptcha end ------------------------- + /** * 创建圆圈干扰的验证码,默认5位验证码,15个干扰圈 * @@ -86,6 +101,21 @@ public class CaptchaUtil { return new CircleCaptcha(width, height, generator, circleCount); } + /** + * 创建圆圈干扰的验证码 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 + * @param circleCount 干扰圆圈条数 + * @param size 字体的大小 高度的倍数 + * @return {@link CircleCaptcha} + */ + public static CircleCaptcha createCircleCaptcha(int width, int height, int codeCount, int circleCount, float size) { + return new CircleCaptcha(width, height, codeCount, circleCount, size); + } + // ------------------------- circleCaptcha end ------------------------- + /** * 创建扭曲干扰的验证码,默认5位验证码 * @@ -125,10 +155,25 @@ public class CaptchaUtil { return new ShearCaptcha(width, height, generator, thickness); } + /** + * 创建扭曲干扰的验证码,默认5位验证码 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 + * @param thickness 干扰线宽度 + * @param size 字体的大小 高度的倍数 + * @return {@link ShearCaptcha} + */ + public static ShearCaptcha createShearCaptcha(int width, int height, int codeCount, int thickness, float size) { + return new ShearCaptcha(width, height, codeCount, thickness, size); + } + // ------------------------- shearCaptcha end ------------------------- + /** * 创建GIF验证码 * - * @param width 宽 + * @param width 宽 * @param height 高 * @return {@link GifCaptcha} */ @@ -139,8 +184,8 @@ public class CaptchaUtil { /** * 创建GIF验证码 * - * @param width 宽 - * @param height 高 + * @param width 宽 + * @param height 高 * @param codeCount 字符个数 * @return {@link GifCaptcha} */ @@ -151,8 +196,8 @@ public class CaptchaUtil { /** * 创建GIF验证码 * - * @param width 宽 - * @param height 高 + * @param width 宽 + * @param height 高 * @param generator 验证码生成器 * @param thickness 验证码干扰元素个数 * @return {@link GifCaptcha} @@ -160,4 +205,20 @@ public class CaptchaUtil { public static GifCaptcha createGifCaptcha(int width, int height, CodeGenerator generator, int thickness) { return new GifCaptcha(width, height, generator, thickness); } + + /** + * 创建圆圈干扰的验证码 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 + * @param thickness 验证码干扰元素个数 + * @param size 字体的大小 高度的倍数 + * @return {@link GifCaptcha} + */ + public static GifCaptcha createGifCaptcha(int width, int height, int codeCount, int thickness, float size) { + return new GifCaptcha(width, height, codeCount, thickness, size); + } + // ------------------------- gifCaptcha end ------------------------- + } 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 795e05604..27e24bc0e 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/CircleCaptcha.java @@ -24,7 +24,7 @@ public class CircleCaptcha extends AbstractCaptcha { /** * 构造 * - * @param width 图片宽 + * @param width 图片宽 * @param height 图片高 */ public CircleCaptcha(int width, int height) { @@ -34,8 +34,8 @@ public class CircleCaptcha extends AbstractCaptcha { /** * 构造 * - * @param width 图片宽 - * @param height 图片高 + * @param width 图片宽 + * @param height 图片高 * @param codeCount 字符个数 */ public CircleCaptcha(int width, int height, int codeCount) { @@ -45,9 +45,9 @@ public class CircleCaptcha extends AbstractCaptcha { /** * 构造 * - * @param width 图片宽 - * @param height 图片高 - * @param codeCount 字符个数 + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 * @param interfereCount 验证码干扰元素个数 */ public CircleCaptcha(int width, int height, int codeCount, int interfereCount) { @@ -66,12 +66,26 @@ public class CircleCaptcha extends AbstractCaptcha { super(width, height, generator, interfereCount); } + /** + * 构造 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 + * @param interfereCount 验证码干扰元素个数 + * @param size 字体的大小 高度的倍数 + */ + public CircleCaptcha(int width, int height, int codeCount, int interfereCount, float size) { + super(width, height, new RandomGenerator(codeCount), interfereCount, size); + } + + @Override public Image createImage(String code) { final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); final Graphics2D g = ImgUtil.createGraphics(image, ObjectUtil.defaultIfNull(this.background, Color.WHITE)); - try{ + try { // 随机画干扰圈圈 drawInterfere(g); @@ -88,7 +102,7 @@ public class CircleCaptcha extends AbstractCaptcha { /** * 绘制字符串 * - * @param g {@link Graphics2D}画笔 + * @param g {@link Graphics2D}画笔 * @param code 验证码 */ private void drawString(Graphics2D g, String code) { diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java index 388ac5bc3..ba86d6587 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/GifCaptcha.java @@ -53,9 +53,9 @@ public class GifCaptcha extends AbstractCaptcha { } /** - * @param width 验证码宽度 - * @param height 验证码高度 - * @param codeCount 验证码个数 + * @param width 验证码宽度 + * @param height 验证码高度 + * @param codeCount 验证码个数 * @param interfereCount 验证码干扰元素个数 */ public GifCaptcha(int width, int height, int codeCount, int interfereCount) { @@ -74,6 +74,19 @@ public class GifCaptcha extends AbstractCaptcha { super(width, height, generator, interfereCount); } + /** + * 构造 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 验证码个数 + * @param interfereCount 验证码干扰元素个数 + * @param size 字体的大小 高度的倍数 + */ + public GifCaptcha(int width, int height, int codeCount, int interfereCount, float size) { + super(width, height, new RandomGenerator(codeCount), interfereCount, size); + } + /** * 设置图像的颜色量化(转换质量 由GIF规范允许的最大256种颜色)。 * 低的值(最小值= 1)产生更好的颜色,但处理显著缓慢。 @@ -171,7 +184,7 @@ public class GifCaptcha extends AbstractCaptcha { BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //或得图形上下文 Graphics2D g2d = image.createGraphics(); - try{ + try { //利用指定颜色填充背景 g2d.setColor(ObjectUtil.defaultIfNull(this.background, Color.WHITE)); g2d.fillRect(0, 0, width, height); @@ -191,9 +204,9 @@ public class GifCaptcha extends AbstractCaptcha { g2d.setComposite(ac); g2d.setColor(fontColor[i]); g2d.drawOval( - RandomUtil.randomInt(width), - RandomUtil.randomInt(height), - RandomUtil.randomInt(5, 30), 5 + RandomUtil.randomInt(5, 30) + RandomUtil.randomInt(width), + RandomUtil.randomInt(height), + RandomUtil.randomInt(5, 30), 5 + RandomUtil.randomInt(5, 30) );//绘制椭圆边框 g2d.drawString(words[i] + "", x + (font.getSize() + m) * i, y); } 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 6302afab9..197062a7e 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/LineCaptcha.java @@ -24,7 +24,7 @@ public class LineCaptcha extends AbstractCaptcha { /** * 构造,默认5位验证码,150条干扰线 * - * @param width 图片宽 + * @param width 图片宽 * @param height 图片高 */ public LineCaptcha(int width, int height) { @@ -34,8 +34,8 @@ public class LineCaptcha extends AbstractCaptcha { /** * 构造 * - * @param width 图片宽 - * @param height 图片高 + * @param width 图片宽 + * @param height 图片高 * @param codeCount 字符个数 * @param lineCount 干扰线条数 */ @@ -54,6 +54,21 @@ public class LineCaptcha extends AbstractCaptcha { public LineCaptcha(int width, int height, CodeGenerator generator, int interfereCount) { super(width, height, generator, interfereCount); } + + /** + * 构造 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 + * @param interfereCount 验证码干扰元素个数 + * @param size 字体的大小 高度的倍数 + */ + public LineCaptcha(int width, int height, int codeCount, int interfereCount, float size) { + super(width, height, new RandomGenerator(codeCount), interfereCount, size); + } + + // -------------------------------------------------------------------- Constructor end @Override @@ -79,7 +94,7 @@ public class LineCaptcha extends AbstractCaptcha { /** * 绘制字符串 * - * @param g {@link Graphics}画笔 + * @param g {@link Graphics}画笔 * @param code 验证码 */ private void drawString(Graphics2D g, String code) { 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 fe9a51cb7..7216837fd 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java @@ -68,6 +68,20 @@ public class ShearCaptcha extends AbstractCaptcha { super(width, height, generator, interfereCount); } + + /** + * 构造 + * + * @param width 图片宽 + * @param height 图片高 + * @param codeCount 字符个数 + * @param interfereCount 验证码干扰元素个数 + * @param size 字体的大小 高度的倍数 + */ + public ShearCaptcha(int width, int height, int codeCount, int interfereCount, float size) { + super(width, height, new RandomGenerator(codeCount), interfereCount, size); + } + @Override public Image createImage(String code) { final BufferedImage image = new BufferedImage(this.width, this.height, BufferedImage.TYPE_INT_RGB); diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java index 965cbc1e7..c1cef44c5 100755 --- a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java +++ b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaTest.java @@ -32,6 +32,15 @@ public class CaptchaTest { lineCaptcha.write("f:/test/captcha/tellow.png"); } + @Test + @Ignore + public void lineCaptchaTestWithSize() { + // 定义图形验证码的长和宽 + LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 70, 4, 15, 0.65f); + lineCaptcha.setBackground(Color.yellow); + lineCaptcha.write("f:/test/captcha/tellow.png"); + } + @Test @Ignore public void lineCaptchaWithMathTest() { @@ -75,12 +84,22 @@ public class CaptchaTest { captcha.verify("1234"); } + + @Test + @Ignore + public void circleCaptchaTestWithSize() { + // 定义图形验证码的长和宽 + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 70, 4, 15, 0.65f); + captcha.setBackground(Color.yellow); + captcha.write("f:/test/captcha/circle.png"); + } + @Test @Ignore public void shearCaptchaTest() { // 定义图形验证码的长和宽 - ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(203, 100, 4, 4); + ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4); // ShearCaptcha captcha = new ShearCaptcha(200, 100, 4, 4); // 图形验证码写出,可以写出到文件,也可以写出到流 captcha.write("f:/captcha/shear.png"); @@ -113,6 +132,16 @@ public class CaptchaTest { captcha.verify("1234"); } + + @Test + @Ignore + public void ShearCaptchaTestWithSize() { + // 定义图形验证码的长和宽 + ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 70, 4, 15, 0.65f); + captcha.setBackground(Color.yellow); + captcha.write("f:/test/captcha/shear.png"); + } + @Test @Ignore public void GifCaptchaTest() { @@ -123,7 +152,16 @@ public class CaptchaTest { @Test @Ignore - public void bgTest(){ + public void GifCaptchaTestWithSize() { + // 定义图形验证码的长和宽 + GifCaptcha captcha = CaptchaUtil.createGifCaptcha(200, 70, 4, 15, 0.65f); + captcha.setBackground(Color.yellow); + captcha.write("f:/test/captcha/gif.png"); + } + + @Test + @Ignore + public void bgTest() { LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 100, 4, 1); captcha.setBackground(Color.WHITE); captcha.write("d:/test/test.jpg");