From a6f0193e1940bd9797fcf90b1003bd9dbedc171c Mon Sep 17 00:00:00 2001 From: chenzecheng <陈泽成@chenzecheng> Date: Fri, 9 Aug 2024 09:40:28 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B2=E6=AD=A2=E8=AE=BE=E7=BD=AE=E8=89=B2?= =?UTF-8?q?=E5=B7=AE=E8=BF=87=E5=A4=A7=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E6=AC=A1=E6=95=B0=E8=BF=87=E5=A4=9A=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=BB=98=E8=AE=A4=E8=89=B2=E5=B7=AE=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/captcha/CaptchaUtilTest.java | 40 ++++++++++++++++--- .../java/cn/hutool/core/img/ColorUtil.java | 18 +++++++++ .../java/cn/hutool/core/img/GraphicsUtil.java | 17 ++++++++ .../main/java/cn/hutool/core/img/ImgUtil.java | 11 +++++ 4 files changed, 80 insertions(+), 6 deletions(-) diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaUtilTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaUtilTest.java index f2ac31734..6efd38772 100755 --- a/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaUtilTest.java +++ b/hutool-captcha/src/test/java/cn/hutool/captcha/CaptchaUtilTest.java @@ -26,17 +26,26 @@ public class CaptchaUtilTest { @Test @Ignore - public void drawStringColourfulTest() { + public void drawStringColourfulColorDistanceTest() { for(int i = 0; i < 10; i++) { - AbstractCaptcha lineCaptcha = new TestLineCaptcha(200, 100, 5, 10); - lineCaptcha.write("d:/captcha/line"+i+".png"); + AbstractCaptcha lineCaptcha = new TestLineCaptchaColorDistance(200, 100, 5, 10); + lineCaptcha.write("d:/captcha/line1-"+i+".png"); } } - static class TestLineCaptcha extends AbstractCaptcha{ + @Test + @Ignore + public void drawStringColourfulDefaultColorDistanceTest() { + for(int i = 0; i < 10; i++) { + AbstractCaptcha lineCaptcha = new TestLineCaptchaColorDistanceDefaultColorDistance(200, 100, 5, 10); + lineCaptcha.write("d:/captcha/line2-"+i+".png"); + } + } + + static class TestLineCaptchaColorDistance extends AbstractCaptcha{ private static final long serialVersionUID = -558846929114465692L; - public TestLineCaptcha(int width, int height, int codeCount, int interfereCount) { + public TestLineCaptchaColorDistance(int width, int height, int codeCount, int interfereCount) { super(width, height, codeCount, interfereCount); } @@ -62,11 +71,12 @@ public class CaptchaUtilTest { * @param g {@link Graphics}画笔 * @param code 验证码 */ - private void drawString(Graphics2D g, String code) { + protected void drawString(Graphics2D g, String code) { // 指定透明度 if (null != this.textAlpha) { g.setComposite(this.textAlpha); } + // 自定义与背景颜色的色差值,200是基于Color.WHITE较为居中的值 GraphicsUtil.drawStringColourful(g, code, this.font, this.width, this.height,Color.WHITE,200); } @@ -89,4 +99,22 @@ public class CaptchaUtilTest { } // ----------------------------------------------------------------------------------------------------- Private method start } + + static class TestLineCaptchaColorDistanceDefaultColorDistance extends TestLineCaptchaColorDistance { + + + public TestLineCaptchaColorDistanceDefaultColorDistance(int width, int height, int codeCount, int interfereCount) { + super(width, height, codeCount, interfereCount); + } + + @Override + protected void drawString(Graphics2D g, String code) { + // 指定透明度 + if (null != this.textAlpha) { + g.setComposite(this.textAlpha); + } + // 使用默认色差设置 + GraphicsUtil.drawStringColourful(g, code, this.font, this.width, this.height,Color.WHITE); + } + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ColorUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ColorUtil.java index 71355d9a4..b6cfc6d8d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/ColorUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ColorUtil.java @@ -1,6 +1,7 @@ package cn.hutool.core.img; import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; @@ -178,6 +179,9 @@ public class ColorUtil { * @since 5.8.30 */ public static Color randomColor(Color compareColor,int minDistance) { + // 注意minDistance太大会增加循环次数,保证至少1/3的概率生成成功 + Assert.isTrue(minDistance < maxDistance(compareColor) / 3 * 2, + "minDistance is too large, there are too few remaining colors!"); Color color = randomColor(); while (computeColorDistance(compareColor,color) < minDistance) { color = randomColor(); @@ -195,6 +199,20 @@ public class ColorUtil { return randomColor(null); } + /** + * 计算给定点与其他点之间的最大可能距离。 + * + * @param color 指定颜色 + * @return 其余颜色与color的最大距离 + * @since 6.0.0-M16 + */ + public static int maxDistance(final Color color) { + final int maxX = RGB_COLOR_BOUND - 2 * color.getRed(); + final int maxY = RGB_COLOR_BOUND - 2 * color.getGreen(); + final int maxZ = RGB_COLOR_BOUND - 2 * color.getBlue(); + return (int)Math.sqrt(maxX * maxX + maxY * maxY + maxZ * maxZ); + } + /** * 计算两个颜色之间的色差,按三维坐标距离计算 * diff --git a/hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java index d67cb4b4e..32868f692 100755 --- a/hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/GraphicsUtil.java @@ -101,6 +101,23 @@ public class GraphicsUtil { return drawString(g, str, font, null, width, height, compareColor, minColorDistance); } + /** + * 绘制字符串,使用随机颜色,并且与背景颜色保持一定色差,默认抗锯齿 + * + * @param g {@link Graphics}画笔 + * @param str 字符串 + * @param font 字体 + * @param width 字符串总宽度 + * @param height 字符串背景高度 + * @param backgroundColor 背景颜色 + * @return 画笔对象 + * @since 4.5.10 + */ + public static Graphics drawStringColourful(Graphics g, String str, Font font, int width, int height, Color backgroundColor) { + // 默认色差为最大色差的1/2 + return drawString(g, str, font, null, width, height, backgroundColor, ColorUtil.maxDistance(backgroundColor) / 2); + } + /** * 绘制字符串,默认抗锯齿 * diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java index f28416b82..bb64dbca5 100755 --- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java @@ -2237,6 +2237,17 @@ public class ImgUtil { return ColorUtil.randomColor(compareColor,minDistance); } + /** + * 生成随机颜色,与指定颜色有一定的区分度 + * + * @param compareColor 比较颜色 + * @return 与指定颜色有一定的区分度的随机颜色,默认是最大可能的三维距离的一半 + * @since 5.8.30 + */ + public static Color randomColor(Color compareColor) { + return ColorUtil.randomColor(compareColor,ColorUtil.maxDistance(compareColor) / 2); + } + /** * 生成随机颜色 *