From 0b636eaa9f66a4e3bf1ebd7608047e60df9f6b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E7=88=B1=E6=9C=89=E6=83=85?= Date: Thu, 25 Aug 2022 11:09:18 +0800 Subject: [PATCH] =?UTF-8?q?U=20=E5=8D=87=E7=BA=A7=E4=B8=BA1.3.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- readme.md | 24 ++++-- .../AbstractImageCaptchaGenerator.java | 77 ++++++------------- .../generator/ImageCaptchaGenerator.java | 23 ++++++ .../ImageCaptchaGeneratorProvider.java | 3 +- .../captcha/generator/ImageTransform.java | 20 +++++ .../impl/CacheImageCaptchaGenerator.java | 16 ++++ .../impl/MultiImageCaptchaGenerator.java | 25 +++++- .../StandardConcatImageCaptchaGenerator.java | 8 +- ...dRandomWordClickImageCaptchaGenerator.java | 11 ++- .../StandardRotateImageCaptchaGenerator.java | 13 ++-- .../StandardSliderImageCaptchaGenerator.java | 10 ++- ...rdConcatImageCaptchaGeneratorProvider.java | 6 +- ...ordClickImageCaptchaGeneratorProvider.java | 5 +- ...rdRotateImageCaptchaGeneratorProvider.java | 5 +- ...derImageImageCaptchaGeneratorProvider.java | 7 +- .../impl/transform/Base64ImageTransform.java | 58 ++++++++++++++ 17 files changed, 229 insertions(+), 84 deletions(-) create mode 100644 src/main/java/cloud/tianai/captcha/generator/ImageTransform.java create mode 100644 src/main/java/cloud/tianai/captcha/generator/impl/transform/Base64ImageTransform.java diff --git a/pom.xml b/pom.xml index 9c7d8a8..ca982a8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 cloud.tianai.captcha tianai-captcha - 1.3.2 + 1.3.3 tianai-captcha 行为验证码 diff --git a/readme.md b/readme.md index 82a73d1..f77706c 100644 --- a/readme.md +++ b/readme.md @@ -32,7 +32,7 @@ cloud.tianai.captcha tianai-captcha - 1.3.2 + 1.3.3 ``` @@ -55,7 +55,8 @@ import java.util.Map; public class Test { public static void main(String[] args) throws InterruptedException { ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); + ImageTransform imageTransform = new Base64ImageTransform(); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true); /* 生成滑块验证码图片, 可选项 SLIDER (滑块验证码) @@ -124,6 +125,8 @@ public class Test2 { - 资源存储(`ResourceStore`) 负责存储背景图和模板图 - 资源提供者(`ResourceProvider`) 负责将资源存储器中对应的资源转换为文件流 - 一般资源存储器中存储的是图片的url地址或者id之类, 资源提供者 就是负责将url或者别的id转换为真正的图片文件 +- 图片转换器 (`ImageTransform`) + - 主要负责将图片文件流转换成字符串类型,可以是base64格式/url 或其它加密格式,默认实现是bas64格式 ## 扩展 @@ -134,9 +137,11 @@ package example.readme; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.transform.Base64ImageTransform; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; @@ -144,8 +149,9 @@ public class Test3 { public static void main(String[] args) { // 资源管理器 ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageTransform imageTransform = new Base64ImageTransform(); // 标准验证码生成器 - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true); // 生成 具有混淆的 滑块验证码 (目前只有滑块验证码支持混淆滑块, 旋转验证,滑动还原,点选验证 均不支持混淆功能) ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder() .type(CaptchaTypeConstant.SLIDER) @@ -176,8 +182,9 @@ public class Test4 { public static void main(String[] args) { // 资源管理器 ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageTransform imageTransform = new Base64ImageTransform(); // 标准验证码生成器 - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true); // 生成旋转验证码 图片类型为 webp // 注意 tianai-captcha-1.3.2 后面默认删除了生成webp格式图片需要用户自定义添加webp转换的工具,需要用户自定义添加和扩展 // 参考 https://bitbucket.org/luciad/webp-imageio @@ -278,9 +285,10 @@ import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; public class Test6 { public static void main(String[] args) { ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageTransform imageTransform = new Base64ImageTransform(); //为方便快速上手 系统本身自带了一张图片和两套滑块模板,如果不想用系统自带的可以不让它加载系统自带的 // 第二个构造参数设置为false时将不加载默认的图片和模板 - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, imageTransform).init(false); } } @@ -331,7 +339,8 @@ public class Test7 { } }; ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false); + ImageTransform imageTransform = new Base64ImageTransform(); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(false); // 注册 imageCaptchaResourceManager.registerResourceProvider(resourceProvider); } @@ -362,7 +371,8 @@ public class Test8 { // 参数三: 出错后 等待xx时间再进行生成 // 参数四: 检查时间间隔 ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager), 10, 1000, 100); + ImageTransform imageTransform = new Base64ImageTransform(); + ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform), 10, 1000, 100); imageCaptchaGenerator.init(true); // 生成滑块图片 ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER); diff --git a/src/main/java/cloud/tianai/captcha/generator/AbstractImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/AbstractImageCaptchaGenerator.java index 38838b3..5274a76 100644 --- a/src/main/java/cloud/tianai/captcha/generator/AbstractImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/AbstractImageCaptchaGenerator.java @@ -2,8 +2,7 @@ package cloud.tianai.captcha.generator; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; -import cloud.tianai.captcha.generator.common.util.ImgWriter; +import cloud.tianai.captcha.generator.impl.transform.Base64ImageTransform; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.common.model.dto.Resource; import lombok.Getter; @@ -11,11 +10,7 @@ import lombok.Setter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; import java.io.InputStream; -import java.util.Base64; import java.util.Map; /** @@ -37,10 +32,12 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener /** 默认滑块图片类型. */ public String defaultSliderImageType = DEFAULT_SLIDER_IMAGE_TYPE; - @Getter - @Setter /** 资源管理器. */ protected ImageCaptchaResourceManager imageCaptchaResourceManager; + + /** 图片转换器. */ + protected ImageTransform imageTransform; + @Getter private boolean init = false; @@ -55,6 +52,10 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener init = true; try { log.info("图片验证码[{}]初始化...", this.getClass().getSimpleName()); + // 设置默认图片转换器 + if (getImageTransform() == null) { + setImageTransform(new Base64ImageTransform()); + } doInit(initDefaultResource); } catch (Exception e) { init = false; @@ -90,51 +91,6 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener return doGenerateCaptchaImage(param); } - - /** - * 将图片转换成字符串格式 - * - * @param bufferedImage 图片 - * @param formatType 格式化类型 - * @return String - */ - @SneakyThrows(Exception.class) - public String transform(BufferedImage bufferedImage, String formatType) { - // 这里判断处理一下,加一些警告日志 - String result = beforeTransform(bufferedImage, formatType); - if (result != null) { - return result; - } - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - if (CaptchaImageUtils.isPng(formatType) || CaptchaImageUtils.isJpeg(formatType)) { - // 如果是 jpg 或者 png图片的话 用hutool的生成 - ImgWriter.write(bufferedImage, formatType, byteArrayOutputStream, -1); - } else { - ImageIO.write(bufferedImage, formatType, byteArrayOutputStream); - } - //转换成字节码 - byte[] data = byteArrayOutputStream.toByteArray(); - String base64 = Base64.getEncoder().encodeToString(data); - return "data:image/" + formatType + ";base64,".concat(base64); - } - - public String beforeTransform(BufferedImage bufferedImage, String formatType) { -// int type = bufferedImage.getType(); -// if (BufferedImage.TYPE_4BYTE_ABGR == type) { -// // png , 如果转换的是jpg的话 -// if (CaptchaImageUtils.isJpeg(formatType)) { -// // bufferedImage为 png, 但是转换的图片为 jpg -// if (log.isWarnEnabled()) { -// log.warn("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致"); -// } else { -// System.err.println("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致"); -// } -// } -// } - // 其它的暂时不考虑 - return null; - } - protected InputStream getTemplateFile(Map templateImages, String imageName) { Resource resource = templateImages.get(imageName); if (resource == null) { @@ -169,4 +125,19 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener public ImageCaptchaResourceManager getImageResourceManager() { return imageCaptchaResourceManager; } + + @Override + public void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager) { + this.imageCaptchaResourceManager = imageCaptchaResourceManager; + } + + @Override + public ImageTransform getImageTransform() { + return imageTransform; + } + + @Override + public void setImageTransform(ImageTransform imageTransform) { + this.imageTransform = imageTransform; + } } diff --git a/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGenerator.java index cd23355..719bd29 100644 --- a/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGenerator.java @@ -15,6 +15,7 @@ public interface ImageCaptchaGenerator { /** * 初始化 + * * @param initDefaultResource 是否初始化默认资源 * @return ImageCaptchaGenerator */ @@ -55,4 +56,26 @@ public interface ImageCaptchaGenerator { */ ImageCaptchaResourceManager getImageResourceManager(); + /** + * 设置滑块验证码资源管理器 + * + * @param imageCaptchaResourceManager + */ + void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager); + + /** + * 获取图片转换器 + * + * @return ImageTransform + */ + ImageTransform getImageTransform(); + + /** + * 设置图片转换器 + * + * @param imageTransform imageTransform + * @return ImageTransform + */ + void setImageTransform(ImageTransform imageTransform); + } diff --git a/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGeneratorProvider.java b/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGeneratorProvider.java index b82d722..787500b 100644 --- a/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGeneratorProvider.java +++ b/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGeneratorProvider.java @@ -14,9 +14,10 @@ public interface ImageCaptchaGeneratorProvider { * 生成/获取 ImageCaptchaGenerator * * @param resourceManager resourceManager + * @param imageTransform imageTransform * @return ImageCaptchaGenerator */ - ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager); + ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform); /** * 验证码类型 diff --git a/src/main/java/cloud/tianai/captcha/generator/ImageTransform.java b/src/main/java/cloud/tianai/captcha/generator/ImageTransform.java new file mode 100644 index 0000000..eb50b71 --- /dev/null +++ b/src/main/java/cloud/tianai/captcha/generator/ImageTransform.java @@ -0,0 +1,20 @@ +package cloud.tianai.captcha.generator; + +import java.awt.image.BufferedImage; + +/** + * @Author: 天爱有情 + * @date 2022/8/25 10:21 + * @Description 图片转换为字符串, 扩展接口, 可以转换为文件地址等 + */ +public interface ImageTransform { + + /** + * 转换 + * + * @param bufferedImage 图片 + * @param transformType 转换类型 + * @return String + */ + String transform(BufferedImage bufferedImage, String transformType); +} diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/CacheImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/CacheImageCaptchaGenerator.java index 51308b7..de828fa 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/CacheImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/CacheImageCaptchaGenerator.java @@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl; import cloud.tianai.captcha.common.util.NamedThreadFactory; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; @@ -182,4 +183,19 @@ public class CacheImageCaptchaGenerator implements ImageCaptchaGenerator { public ImageCaptchaResourceManager getImageResourceManager() { return target.getImageResourceManager(); } + + @Override + public void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager) { + target.setImageResourceManager(imageCaptchaResourceManager); + } + + @Override + public ImageTransform getImageTransform() { + return target.getImageTransform(); + } + + @Override + public void setImageTransform(ImageTransform imageTransform) { + target.setImageTransform(imageTransform); + } } diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/MultiImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/MultiImageCaptchaGenerator.java index d4e1444..92fa752 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/MultiImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/MultiImageCaptchaGenerator.java @@ -5,6 +5,7 @@ import cloud.tianai.captcha.common.util.ObjectUtils; import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; import cloud.tianai.captcha.generator.impl.provider.StandardConcatImageCaptchaGeneratorProvider; @@ -33,10 +34,16 @@ public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator { private String defaultCaptcha = CaptchaTypeConstant.SLIDER; protected boolean initDefaultResource = false; + public MultiImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager) { super(imageCaptchaResourceManager); } + public MultiImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) { + super(imageCaptchaResourceManager); + setImageTransform(imageTransform); + } + @Override protected void doInit(boolean initDefaultResource) { this.initDefaultResource = initDefaultResource; @@ -94,8 +101,24 @@ public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator { } imageCaptchaGenerator = imageCaptchaGeneratorMap.computeIfAbsent(type, k -> // get and init - provider.get(getImageCaptchaResourceManager()).init(initDefaultResource)); + provider.get(getImageResourceManager(), getImageTransform()).init(initDefaultResource)); } return imageCaptchaGenerator; } + + @Override + public void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager) { + super.setImageResourceManager(imageCaptchaResourceManager); + for (ImageCaptchaGenerator imageCaptchaGenerator : imageCaptchaGeneratorMap.values()) { + imageCaptchaGenerator.setImageResourceManager(imageCaptchaResourceManager); + } + } + + @Override + public void setImageTransform(ImageTransform imageTransform) { + super.setImageTransform(imageTransform); + for (ImageCaptchaGenerator imageCaptchaGenerator : imageCaptchaGeneratorMap.values()) { + imageCaptchaGenerator.setImageTransform(imageTransform); + } + } } diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/StandardConcatImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardConcatImageCaptchaGenerator.java index 01c4911..70fa4c7 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/StandardConcatImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardConcatImageCaptchaGenerator.java @@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; @@ -31,6 +32,11 @@ public class StandardConcatImageCaptchaGenerator extends AbstractImageCaptchaGen super(imageCaptchaResourceManager); } + public StandardConcatImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) { + super(imageCaptchaResourceManager); + setImageTransform(imageTransform); + } + @Override protected void doInit(boolean initDefaultResource) { if (initDefaultResource) { @@ -80,7 +86,7 @@ public class StandardConcatImageCaptchaGenerator extends AbstractImageCaptchaGen @SneakyThrows private ImageCaptchaInfo wrapConcatCaptchaInfo(int randomX, int randomY, BufferedImage bgImage, GenerateParam param) { - String backGroundImageBase64 = transform(bgImage, param.getBackgroundFormatName()); + String backGroundImageBase64 = getImageTransform().transform(bgImage, param.getBackgroundFormatName()); ImageCaptchaInfo imageCaptchaInfo = ImageCaptchaInfo.of(backGroundImageBase64, null, bgImage.getWidth(), diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java index 5334d4e..52e7b7b 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java @@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.common.util.FontUtils; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; @@ -57,11 +58,13 @@ public class StandardRandomWordClickImageCaptchaGenerator extends AbstractClickI protected float currentFontTopCoef = 0.0f; - @SneakyThrows public StandardRandomWordClickImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager) { super(imageCaptchaResourceManager); - this.imageCaptchaResourceManager = imageCaptchaResourceManager; + } + public StandardRandomWordClickImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) { + super(imageCaptchaResourceManager); + setImageTransform(imageTransform); } @Override @@ -141,8 +144,8 @@ public class StandardRandomWordClickImageCaptchaGenerator extends AbstractClickI // 提示图片 BufferedImage tipImage = genTipImage(checkClickImageCheckDefinitionList).getImage(); ImageCaptchaInfo clickImageCaptchaInfo = new ImageCaptchaInfo(); - clickImageCaptchaInfo.setBackgroundImage(transform(bgImage, param.getBackgroundFormatName())); - clickImageCaptchaInfo.setSliderImage(transform(tipImage, param.getSliderFormatName())); + clickImageCaptchaInfo.setBackgroundImage(getImageTransform().transform(bgImage, param.getBackgroundFormatName())); + clickImageCaptchaInfo.setSliderImage(getImageTransform().transform(tipImage, param.getSliderFormatName())); clickImageCaptchaInfo.setBgImageWidth(bgImage.getWidth()); clickImageCaptchaInfo.setBgImageHeight(bgImage.getHeight()); clickImageCaptchaInfo.setSliderImageWidth(tipImage.getWidth()); diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/StandardRotateImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRotateImageCaptchaGenerator.java index 00bb30b..bd44735 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/StandardRotateImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRotateImageCaptchaGenerator.java @@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; @@ -29,11 +30,13 @@ import java.util.concurrent.ThreadLocalRandom; */ public class StandardRotateImageCaptchaGenerator extends AbstractImageCaptchaGenerator { - protected final ImageCaptchaResourceManager imageCaptchaResourceManager; - public StandardRotateImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager) { super(imageCaptchaResourceManager); - this.imageCaptchaResourceManager = imageCaptchaResourceManager; + } + + public StandardRotateImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) { + super(imageCaptchaResourceManager); + setImageTransform(imageTransform); } @Override @@ -113,8 +116,8 @@ public class StandardRotateImageCaptchaGenerator extends AbstractImageCaptchaGen private ImageCaptchaInfo wrapRotateCaptchaInfo(double degree, int randomX, BufferedImage backgroundImage, BufferedImage sliderImage, GenerateParam param) { String backgroundFormatName = param.getBackgroundFormatName(); String sliderFormatName = param.getSliderFormatName(); - String backGroundImageBase64 = transform(backgroundImage, backgroundFormatName); - String sliderImageBase64 = transform(sliderImage, sliderFormatName); + String backGroundImageBase64 = getImageTransform().transform(backgroundImage, backgroundFormatName); + String sliderImageBase64 = getImageTransform().transform(sliderImage, sliderFormatName); return RotateImageCaptchaInfo.of(degree, randomX, backGroundImageBase64, diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/StandardSliderImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardSliderImageCaptchaGenerator.java index a96a591..bed0e23 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/StandardSliderImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardSliderImageCaptchaGenerator.java @@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant; import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; @@ -44,6 +45,11 @@ public class StandardSliderImageCaptchaGenerator extends AbstractImageCaptchaGen super(imageCaptchaResourceManager); } + public StandardSliderImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) { + super(imageCaptchaResourceManager); + setImageTransform(imageTransform); + } + @Override protected void doInit(boolean initDefaultResource) { if (initDefaultResource) { @@ -127,8 +133,8 @@ public class StandardSliderImageCaptchaGenerator extends AbstractImageCaptchaGen GenerateParam param) { String backgroundFormatName = param.getBackgroundFormatName(); String sliderFormatName = param.getSliderFormatName(); - String backGroundImageBase64 = transform(backgroundImage, backgroundFormatName); - String sliderImageBase64 = transform(sliderImage, sliderFormatName); + String backGroundImageBase64 = getImageTransform().transform(backgroundImage, backgroundFormatName); + String sliderImageBase64 = getImageTransform().transform(sliderImage, sliderFormatName); return SliderImageCaptchaInfo.of(randomX, randomY, backGroundImageBase64, sliderImageBase64, diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardConcatImageCaptchaGeneratorProvider.java b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardConcatImageCaptchaGeneratorProvider.java index 744112d..9954637 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardConcatImageCaptchaGeneratorProvider.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardConcatImageCaptchaGeneratorProvider.java @@ -3,8 +3,10 @@ package cloud.tianai.captcha.generator.impl.provider; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.impl.StandardConcatImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; + /** * @Author: 天爱有情 * @date 2022/5/19 15:12 @@ -12,8 +14,8 @@ import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; */ public class StandardConcatImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider { @Override - public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) { - return new StandardConcatImageCaptchaGenerator(resourceManager); + public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) { + return new StandardConcatImageCaptchaGenerator(resourceManager, imageTransform); } @Override diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRandomWordClickImageCaptchaGeneratorProvider.java b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRandomWordClickImageCaptchaGeneratorProvider.java index 6de075a..bdc6598 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRandomWordClickImageCaptchaGeneratorProvider.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRandomWordClickImageCaptchaGeneratorProvider.java @@ -3,13 +3,14 @@ package cloud.tianai.captcha.generator.impl.provider; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.impl.StandardRandomWordClickImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; public class StandardRandomWordClickImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider { @Override - public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) { - return new StandardRandomWordClickImageCaptchaGenerator(resourceManager); + public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) { + return new StandardRandomWordClickImageCaptchaGenerator(resourceManager, imageTransform); } @Override diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRotateImageCaptchaGeneratorProvider.java b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRotateImageCaptchaGeneratorProvider.java index 3fb30d7..e3851c5 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRotateImageCaptchaGeneratorProvider.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardRotateImageCaptchaGeneratorProvider.java @@ -3,6 +3,7 @@ package cloud.tianai.captcha.generator.impl.provider; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.impl.StandardRotateImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; @@ -13,8 +14,8 @@ import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; */ public class StandardRotateImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider { @Override - public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) { - return new StandardRotateImageCaptchaGenerator(resourceManager); + public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) { + return new StandardRotateImageCaptchaGenerator(resourceManager, imageTransform); } @Override diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardSliderImageImageCaptchaGeneratorProvider.java b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardSliderImageImageCaptchaGeneratorProvider.java index 7e7e5ad..efdbc10 100644 --- a/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardSliderImageImageCaptchaGeneratorProvider.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/provider/StandardSliderImageImageCaptchaGeneratorProvider.java @@ -1,8 +1,9 @@ package cloud.tianai.captcha.generator.impl.provider; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider; +import cloud.tianai.captcha.generator.ImageTransform; import cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; @@ -13,8 +14,8 @@ import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; */ public class StandardSliderImageImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider { @Override - public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) { - return new StandardSliderImageCaptchaGenerator(resourceManager); + public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) { + return new StandardSliderImageCaptchaGenerator(resourceManager, imageTransform); } @Override diff --git a/src/main/java/cloud/tianai/captcha/generator/impl/transform/Base64ImageTransform.java b/src/main/java/cloud/tianai/captcha/generator/impl/transform/Base64ImageTransform.java new file mode 100644 index 0000000..80c5f55 --- /dev/null +++ b/src/main/java/cloud/tianai/captcha/generator/impl/transform/Base64ImageTransform.java @@ -0,0 +1,58 @@ +package cloud.tianai.captcha.generator.impl.transform; + +import cloud.tianai.captcha.generator.ImageTransform; +import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; +import cloud.tianai.captcha.generator.common.util.ImgWriter; +import lombok.SneakyThrows; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Base64; + +/** + * @Author: 天爱有情 + * @date 2022/8/25 10:28 + * @Description base64 实现 + */ +public class Base64ImageTransform implements ImageTransform { + + @Override + @SneakyThrows(IOException.class) + public String transform(BufferedImage bufferedImage, String transformType) { + // 这里判断处理一下,加一些警告日志 + String result = beforeTransform(bufferedImage, transformType); + if (result != null) { + return result; + } + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + if (CaptchaImageUtils.isPng(transformType) || CaptchaImageUtils.isJpeg(transformType)) { + // 如果是 jpg 或者 png图片的话 用hutool的生成 + ImgWriter.write(bufferedImage, transformType, byteArrayOutputStream, -1); + } else { + ImageIO.write(bufferedImage, transformType, byteArrayOutputStream); + } + //转换成字节码 + byte[] data = byteArrayOutputStream.toByteArray(); + String base64 = Base64.getEncoder().encodeToString(data); + return "data:image/" + transformType + ";base64,".concat(base64); + } + + public String beforeTransform(BufferedImage bufferedImage, String formatType) { +// int type = bufferedImage.getType(); +// if (BufferedImage.TYPE_4BYTE_ABGR == type) { +// // png , 如果转换的是jpg的话 +// if (CaptchaImageUtils.isJpeg(formatType)) { +// // bufferedImage为 png, 但是转换的图片为 jpg +// if (log.isWarnEnabled()) { +// log.warn("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致"); +// } else { +// System.err.println("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致"); +// } +// } +// } + // 其它的暂时不考虑 + return null; + } +}