mirror of
https://github.com/dromara/tianai-captcha.git
synced 2026-08-30 10:26:11 +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 Object expand;
|
||||||
|
|
||||||
public SliderCaptchaInfo(Integer x, Float xPercent, Integer y, String backgroundImage, String sliderImage) {
|
public SliderCaptchaInfo(Integer x, Float xPercent, Integer y, String backgroundImage, String sliderImage) {
|
||||||
this.x = x;
|
this.x = x;
|
||||||
this.xPercent = xPercent;
|
this.xPercent = xPercent;
|
||||||
@@ -48,7 +49,4 @@ public class SliderCaptchaInfo {
|
|||||||
return new SliderCaptchaInfo(x, xPercent, y, backgroundImage, sliderImage);
|
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.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
import static cloud.tianai.captcha.template.slider.CaptchaImageUtils.*;
|
import static cloud.tianai.captcha.template.slider.CaptchaImageUtils.*;
|
||||||
@@ -39,7 +38,6 @@ public class StandardSliderCaptchaTemplate implements SliderCaptchaTemplate {
|
|||||||
public static float DEFAULT_TOLERANT = 0.02f;
|
public static float DEFAULT_TOLERANT = 0.02f;
|
||||||
|
|
||||||
protected final SliderCaptchaResourceManager sliderCaptchaResourceManager;
|
protected final SliderCaptchaResourceManager sliderCaptchaResourceManager;
|
||||||
protected final CaptchaImageConverter captchaImageConverter;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@@ -55,10 +53,8 @@ public class StandardSliderCaptchaTemplate implements SliderCaptchaTemplate {
|
|||||||
public String defaultSliderImageType = DEFAULT_SLIDER_IMAGE_TYPE;
|
public String defaultSliderImageType = DEFAULT_SLIDER_IMAGE_TYPE;
|
||||||
|
|
||||||
public StandardSliderCaptchaTemplate(SliderCaptchaResourceManager sliderCaptchaResourceManager,
|
public StandardSliderCaptchaTemplate(SliderCaptchaResourceManager sliderCaptchaResourceManager,
|
||||||
CaptchaImageConverter captchaImageConverter,
|
|
||||||
boolean initDefaultResource) {
|
boolean initDefaultResource) {
|
||||||
this.sliderCaptchaResourceManager = sliderCaptchaResourceManager;
|
this.sliderCaptchaResourceManager = sliderCaptchaResourceManager;
|
||||||
this.captchaImageConverter = captchaImageConverter;
|
|
||||||
if (initDefaultResource) {
|
if (initDefaultResource) {
|
||||||
initDefaultResource();
|
initDefaultResource();
|
||||||
}
|
}
|
||||||
@@ -124,9 +120,7 @@ public class StandardSliderCaptchaTemplate implements SliderCaptchaTemplate {
|
|||||||
BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
|
BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
|
||||||
overlayImage(cutImage, activeTemplate, 0, 0);
|
overlayImage(cutImage, activeTemplate, 0, 0);
|
||||||
overlayImage(matrixTemplate, cutImage, 0, randomY);
|
overlayImage(matrixTemplate, cutImage, 0, randomY);
|
||||||
// 计算滑块百分比
|
return wrapSliderCaptchaInfo(randomX, randomY, targetBackground, matrixTemplate, param);
|
||||||
float xPercent = (float) randomX / targetBackground.getWidth();
|
|
||||||
return captchaImageConverter.convert(OriginalSliderData.of(randomX, randomY, xPercent, targetBackground, matrixTemplate, param));
|
|
||||||
} finally {
|
} finally {
|
||||||
// 使用完后关闭流
|
// 使用完后关闭流
|
||||||
for (InputStream inputStream : inputStreams) {
|
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