diff --git a/src/main/java/cloud/tianai/captcha/template/slider/CaptchaImageConverter.java b/src/main/java/cloud/tianai/captcha/template/slider/CaptchaImageConverter.java deleted file mode 100644 index 7e3cbfd..0000000 --- a/src/main/java/cloud/tianai/captcha/template/slider/CaptchaImageConverter.java +++ /dev/null @@ -1,11 +0,0 @@ -package cloud.tianai.captcha.template.slider; - -/** - * @Author: 天爱有情 - * @date 2022/2/16 10:04 - * @Description 验证码图片转换器,将生成的 OriginalSliderData 转换成 SliderCaptchaInfo, 可以对齐进行加密,转换成base64、url等扩展 - */ -public interface CaptchaImageConverter { - - SliderCaptchaInfo convert(OriginalSliderData originalSliderData); -} diff --git a/src/main/java/cloud/tianai/captcha/template/slider/DefaultCaptchaImageConverter.java b/src/main/java/cloud/tianai/captcha/template/slider/DefaultCaptchaImageConverter.java deleted file mode 100644 index ced6ec7..0000000 --- a/src/main/java/cloud/tianai/captcha/template/slider/DefaultCaptchaImageConverter.java +++ /dev/null @@ -1,41 +0,0 @@ -package cloud.tianai.captcha.template.slider; - -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/2/16 10:23 - * @Description 默认 CaptchaImageConverter - */ -public class DefaultCaptchaImageConverter implements CaptchaImageConverter { - - @Override - @SneakyThrows - public SliderCaptchaInfo convert(OriginalSliderData originalSliderData) { - GenerateParam param = originalSliderData.getGenerateParam(); - BufferedImage backgroundImage = originalSliderData.getBackgroundImage(); - BufferedImage sliderImage = originalSliderData.getSliderImage(); - String backgroundFormatName = param.getBackgroundFormatName(); - String sliderFormatName = param.getSliderFormatName(); - String backGroundImageBase64 = transform(backgroundImage, backgroundFormatName); - String sliderImageBase64 = transform(sliderImage, sliderFormatName); - return SliderCaptchaInfo.of(originalSliderData, - backGroundImageBase64, - sliderImageBase64); - } - - public String transform(BufferedImage bufferedImage, String formatName) throws IOException { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ImageIO.write(bufferedImage, formatName, byteArrayOutputStream); - //转换成字节码 - byte[] data = byteArrayOutputStream.toByteArray(); - String base64 = Base64.getEncoder().encodeToString(data); - return "data:image/" + formatName + ";base64,".concat(base64); - } -} diff --git a/src/main/java/cloud/tianai/captcha/template/slider/OriginalSliderData.java b/src/main/java/cloud/tianai/captcha/template/slider/OriginalSliderData.java deleted file mode 100644 index fa0b76d..0000000 --- a/src/main/java/cloud/tianai/captcha/template/slider/OriginalSliderData.java +++ /dev/null @@ -1,40 +0,0 @@ -package cloud.tianai.captcha.template.slider; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.awt.image.BufferedImage; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class OriginalSliderData { - /** - * x轴 - */ - private Integer x; - /** - * y轴 - */ - private Integer y; - - /** 滑块要凹槽的百分比. */ - private float xPercent; - /** - * 背景图 - */ - private BufferedImage backgroundImage; - /** - * 移动图 - */ - private BufferedImage sliderImage; - /** - * 生成参数 - */ - private GenerateParam generateParam; - - public static OriginalSliderData of(Integer x, Integer y, float xPercent, BufferedImage backgroundImage, BufferedImage sliderImage, GenerateParam generateParam) { - return new OriginalSliderData(x, y, xPercent, backgroundImage, sliderImage, generateParam); - } -} \ No newline at end of file diff --git a/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaInfo.java b/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaInfo.java index 669839d..992234d 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaInfo.java +++ b/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaInfo.java @@ -36,6 +36,7 @@ public class SliderCaptchaInfo { * 扩展字段 */ public Object expand; + public SliderCaptchaInfo(Integer x, Float xPercent, Integer y, String backgroundImage, String sliderImage) { this.x = x; this.xPercent = xPercent; @@ -48,7 +49,4 @@ public class SliderCaptchaInfo { return new SliderCaptchaInfo(x, xPercent, y, backgroundImage, sliderImage); } - public static SliderCaptchaInfo of(OriginalSliderData originalSliderData, String backgroundImage, String sliderImage) { - return new SliderCaptchaInfo(originalSliderData.getX(), originalSliderData.getXPercent(), originalSliderData.getY(), backgroundImage, sliderImage); - } } diff --git a/src/main/java/cloud/tianai/captcha/template/slider/StandardSliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/StandardSliderCaptchaTemplate.java index 379220c..0654469 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/StandardSliderCaptchaTemplate.java +++ b/src/main/java/cloud/tianai/captcha/template/slider/StandardSliderCaptchaTemplate.java @@ -6,13 +6,12 @@ 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.IOException; import java.io.InputStream; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; import static cloud.tianai.captcha.template.slider.CaptchaImageUtils.*; @@ -39,7 +38,6 @@ public class StandardSliderCaptchaTemplate implements SliderCaptchaTemplate { public static float DEFAULT_TOLERANT = 0.02f; protected final SliderCaptchaResourceManager sliderCaptchaResourceManager; - protected final CaptchaImageConverter captchaImageConverter; @Getter @Setter @@ -55,10 +53,8 @@ public class StandardSliderCaptchaTemplate implements SliderCaptchaTemplate { public String defaultSliderImageType = DEFAULT_SLIDER_IMAGE_TYPE; public StandardSliderCaptchaTemplate(SliderCaptchaResourceManager sliderCaptchaResourceManager, - CaptchaImageConverter captchaImageConverter, boolean initDefaultResource) { this.sliderCaptchaResourceManager = sliderCaptchaResourceManager; - this.captchaImageConverter = captchaImageConverter; if (initDefaultResource) { initDefaultResource(); } @@ -124,9 +120,7 @@ public class StandardSliderCaptchaTemplate implements SliderCaptchaTemplate { BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY); overlayImage(cutImage, activeTemplate, 0, 0); overlayImage(matrixTemplate, cutImage, 0, randomY); - // 计算滑块百分比 - float xPercent = (float) randomX / targetBackground.getWidth(); - return captchaImageConverter.convert(OriginalSliderData.of(randomX, randomY, xPercent, targetBackground, matrixTemplate, param)); + return wrapSliderCaptchaInfo(randomX, randomY, targetBackground, matrixTemplate, param); } finally { // 使用完后关闭流 for (InputStream inputStream : inputStreams) { @@ -139,6 +133,49 @@ public class StandardSliderCaptchaTemplate implements SliderCaptchaTemplate { } } + /** + * 包装成 SliderCaptchaInfo + * + * @param randomX 随机生成的 x轴 + * @param randomY 随机生成的 y轴 + * @param backgroundImage 背景图片 + * @param sliderImage 滑块图片 + * @param param 接口传入参数 + * @return SliderCaptchaInfo + */ + @SneakyThrows + public SliderCaptchaInfo wrapSliderCaptchaInfo(int randomX, + int randomY, + BufferedImage backgroundImage, + BufferedImage sliderImage, + GenerateParam param) { + String backgroundFormatName = param.getBackgroundFormatName(); + String sliderFormatName = param.getSliderFormatName(); + // 计算滑块百分比 + float xPercent = (float) randomX / backgroundImage.getWidth(); + String backGroundImageBase64 = transform(backgroundImage, backgroundFormatName); + String sliderImageBase64 = transform(sliderImage, sliderFormatName); + return SliderCaptchaInfo.of(randomX, xPercent, randomY, + backGroundImageBase64, + sliderImageBase64); + } + + /** + * 将图片转换成字符串格式 + * @param bufferedImage 图片 + * @param formatType 格式化类型 + * @return String + * @throws IOException + */ + public String transform(BufferedImage bufferedImage, String formatType) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(bufferedImage, formatType, byteArrayOutputStream); + //转换成字节码 + byte[] data = byteArrayOutputStream.toByteArray(); + String base64 = Base64.getEncoder().encodeToString(data); + return "data:image/" + formatType + ";base64,".concat(base64); + } + /** * 百分比对比 *