U 优化代码

This commit is contained in:
天爱有情
2022-02-16 11:35:02 +08:00
parent 18a0c5f40b
commit 167d7b56f1
5 changed files with 48 additions and 105 deletions
@@ -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);
}
}
@@ -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);
}
/**
* 百分比对比
*