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;
+ }
+}