mirror of
https://github.com/dromara/tianai-captcha.git
synced 2026-05-07 06:04:34 +08:00
U 处理使用完后不关闭流的问题
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>cloud.tianai.captcha</groupId>
|
<groupId>cloud.tianai.captcha</groupId>
|
||||||
<artifactId>tianai-captcha</artifactId>
|
<artifactId>tianai-captcha</artifactId>
|
||||||
<version>1.2</version>
|
<version>1.2.2</version>
|
||||||
|
|
||||||
<name>tianai-captcha</name>
|
<name>tianai-captcha</name>
|
||||||
<description>滑块验证码</description>
|
<description>滑块验证码</description>
|
||||||
|
|||||||
+47
-23
@@ -12,12 +12,10 @@ import java.awt.image.ColorModel;
|
|||||||
import java.awt.image.PixelGrabber;
|
import java.awt.image.PixelGrabber;
|
||||||
import java.awt.image.WritableRaster;
|
import java.awt.image.WritableRaster;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Base64;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,33 +91,59 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
|
|||||||
|
|
||||||
|
|
||||||
Map<String, Resource> templateImages = sliderCaptchaResourceManager.randomGetTemplate();
|
Map<String, Resource> templateImages = sliderCaptchaResourceManager.randomGetTemplate();
|
||||||
Resource resourceImage = sliderCaptchaResourceManager.randomGetResource();
|
if (templateImages == null || templateImages.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Collection<InputStream> 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));
|
InputStream matrixTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME);
|
||||||
// 拷贝一份图片
|
inputStreams.add(matrixTemplateInput);
|
||||||
BufferedImage targetBackground = deepCopyBufferedImage(cutBackground);
|
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));
|
// BufferedImage cutTemplate = warpFile2BufferedImage(getTemplateFile(templateImages, CUT_IMAGE_NAME));
|
||||||
|
|
||||||
// 获取随机的 x 和 y 轴
|
// 获取随机的 x 和 y 轴
|
||||||
int randomX = ThreadLocalRandom.current().nextInt(targetBackground.getWidth() - fixedTemplate.getWidth() * 2) + fixedTemplate.getWidth();
|
int randomX = ThreadLocalRandom.current().nextInt(targetBackground.getWidth() - fixedTemplate.getWidth() * 2) + fixedTemplate.getWidth();
|
||||||
int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight());
|
int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight());
|
||||||
|
|
||||||
coverImage(targetBackground, fixedTemplate, randomX, randomY);
|
coverImage(targetBackground, fixedTemplate, randomX, randomY);
|
||||||
BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
|
BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
|
||||||
coverImage(cutImage, activeTemplate, 0, 0);
|
coverImage(cutImage, activeTemplate, 0, 0);
|
||||||
coverImage(matrixTemplate, cutImage, 0, randomY);
|
coverImage(matrixTemplate, cutImage, 0, randomY);
|
||||||
// 计算滑块百分比
|
// 计算滑块百分比
|
||||||
Float xPercent = (float) randomX / targetBackground.getWidth();
|
Float xPercent = (float) randomX / targetBackground.getWidth();
|
||||||
|
|
||||||
String backGroundImageBase64 = transformBase64(targetBackground, targetFormatName);
|
String backGroundImageBase64 = transformBase64(targetBackground, targetFormatName);
|
||||||
String sliderImageBase64 = transformBase64(matrixTemplate, matrixFormatName);
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user