mirror of
https://github.com/dromara/tianai-captcha.git
synced 2026-05-07 06:04:34 +08:00
U 优化代码
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+47
-10
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 百分比对比
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user