diff --git a/pom.xml b/pom.xml
index 3f82268..c393c1b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
cloud.tianai.captcha
tianai-captcha
- 1.2
+ 1.2.2
tianai-captcha
滑块验证码
diff --git a/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java
index 0616930..f694a75 100644
--- a/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java
+++ b/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java
@@ -12,12 +12,10 @@ import java.awt.image.ColorModel;
import java.awt.image.PixelGrabber;
import java.awt.image.WritableRaster;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
/**
@@ -93,33 +91,59 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
Map templateImages = sliderCaptchaResourceManager.randomGetTemplate();
- Resource resourceImage = sliderCaptchaResourceManager.randomGetResource();
+ if (templateImages == null || templateImages.isEmpty()) {
+ return null;
+ }
+ Collection inputStreams = new LinkedList<>();
+ try {
+ Resource resourceImage = sliderCaptchaResourceManager.randomGetResource();
+
+ InputStream resourceInputStream = sliderCaptchaResourceManager.getResourceInputStream(resourceImage);
+ inputStreams.add(resourceInputStream);
+ BufferedImage cutBackground = warpFile2BufferedImage(resourceInputStream);
+ // 拷贝一份图片
+ BufferedImage targetBackground = deepCopyBufferedImage(cutBackground);
+
+ InputStream fixedTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME);
+ inputStreams.add(fixedTemplateInput);
+ BufferedImage fixedTemplate = warpFile2BufferedImage(fixedTemplateInput);
+
+ InputStream activeTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME);
+ inputStreams.add(activeTemplateInput);
+ BufferedImage activeTemplate = warpFile2BufferedImage(activeTemplateInput);
- BufferedImage cutBackground = warpFile2BufferedImage(sliderCaptchaResourceManager.getResourceInputStream(resourceImage));
- // 拷贝一份图片
- BufferedImage targetBackground = deepCopyBufferedImage(cutBackground);
+ InputStream matrixTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME);
+ inputStreams.add(matrixTemplateInput);
+ BufferedImage matrixTemplate = warpFile2BufferedImage(matrixTemplateInput);
- BufferedImage fixedTemplate = warpFile2BufferedImage(getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME));
- BufferedImage activeTemplate = warpFile2BufferedImage(getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME));
- BufferedImage matrixTemplate = warpFile2BufferedImage(getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME));
// BufferedImage cutTemplate = warpFile2BufferedImage(getTemplateFile(templateImages, CUT_IMAGE_NAME));
- // 获取随机的 x 和 y 轴
- int randomX = ThreadLocalRandom.current().nextInt(targetBackground.getWidth() - fixedTemplate.getWidth() * 2) + fixedTemplate.getWidth();
- int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight());
+ // 获取随机的 x 和 y 轴
+ int randomX = ThreadLocalRandom.current().nextInt(targetBackground.getWidth() - fixedTemplate.getWidth() * 2) + fixedTemplate.getWidth();
+ int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight());
- coverImage(targetBackground, fixedTemplate, randomX, randomY);
- BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
- coverImage(cutImage, activeTemplate, 0, 0);
- coverImage(matrixTemplate, cutImage, 0, randomY);
- // 计算滑块百分比
- Float xPercent = (float) randomX / targetBackground.getWidth();
+ coverImage(targetBackground, fixedTemplate, randomX, randomY);
+ BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
+ coverImage(cutImage, activeTemplate, 0, 0);
+ coverImage(matrixTemplate, cutImage, 0, randomY);
+ // 计算滑块百分比
+ Float xPercent = (float) randomX / targetBackground.getWidth();
- String backGroundImageBase64 = transformBase64(targetBackground, targetFormatName);
- String sliderImageBase64 = transformBase64(matrixTemplate, matrixFormatName);
+ String backGroundImageBase64 = transformBase64(targetBackground, targetFormatName);
+ String sliderImageBase64 = transformBase64(matrixTemplate, matrixFormatName);
- return SliderCaptchaInfo.of(randomX, xPercent, randomY, backGroundImageBase64, sliderImageBase64);
+ return SliderCaptchaInfo.of(randomX, xPercent, randomY, backGroundImageBase64, sliderImageBase64);
+ } finally {
+ // 使用完后关闭流
+ for (InputStream inputStream : inputStreams) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
}
/**