This commit is contained in:
Looly
2024-03-28 17:33:05 +08:00
parent ceb4065647
commit eaed0bb932
3 changed files with 106 additions and 20 deletions

View File

@@ -62,8 +62,13 @@ public class QrCodeUtil {
* @return 图片 Base64 编码字符串 * @return 图片 Base64 编码字符串
*/ */
public static String generateAsBase64DataUri(final String content, final QrConfig qrConfig, final String imageType) { public static String generateAsBase64DataUri(final String content, final QrConfig qrConfig, final String imageType) {
final BufferedImage img = generate(content, qrConfig); BufferedImage img = null;
try{
img = generate(content, qrConfig);
return ImgUtil.toBase64DataUri(img, imageType); return ImgUtil.toBase64DataUri(img, imageType);
} finally {
ImgUtil.flush(img);
}
} }
/** /**
@@ -105,8 +110,13 @@ public class QrCodeUtil {
* @return 目标文件 * @return 目标文件
*/ */
public static File generate(final String content, final int width, final int height, final File targetFile) { public static File generate(final String content, final int width, final int height, final File targetFile) {
final BufferedImage image = generate(content, width, height); BufferedImage image = null;
try{
image = generate(content, width, height);
ImgUtil.write(image, targetFile); ImgUtil.write(image, targetFile);
} finally {
ImgUtil.flush(image);
}
return targetFile; return targetFile;
} }
@@ -120,8 +130,13 @@ public class QrCodeUtil {
* @since 4.1.2 * @since 4.1.2
*/ */
public static File generate(final String content, final QrConfig config, final File targetFile) { public static File generate(final String content, final QrConfig config, final File targetFile) {
final BufferedImage image = generate(content, config); BufferedImage image = null;
try{
image = generate(content, config);
ImgUtil.write(image, targetFile); ImgUtil.write(image, targetFile);
} finally {
ImgUtil.flush(image);
}
return targetFile; return targetFile;
} }
@@ -135,8 +150,13 @@ public class QrCodeUtil {
* @param out 目标流 * @param out 目标流
*/ */
public static void generate(final String content, final int width, final int height, final String imageType, final OutputStream out) { public static void generate(final String content, final int width, final int height, final String imageType, final OutputStream out) {
final BufferedImage image = generate(content, width, height); BufferedImage img = null;
ImgUtil.write(image, imageType, out); try{
img = generate(content, width, height);
ImgUtil.write(img, imageType, out);
} finally {
ImgUtil.flush(img);
}
} }
/** /**
@@ -149,8 +169,13 @@ public class QrCodeUtil {
* @since 4.1.2 * @since 4.1.2
*/ */
public static void generate(final String content, final QrConfig config, final String imageType, final OutputStream out) { public static void generate(final String content, final QrConfig config, final String imageType, final OutputStream out) {
final BufferedImage image = generate(content, config); BufferedImage image = null;
try{
image = generate(content, config);
ImgUtil.write(image, imageType, out); ImgUtil.write(image, imageType, out);
} finally {
ImgUtil.flush(image);
}
} }
/** /**
@@ -201,7 +226,13 @@ public class QrCodeUtil {
* @return 解码文本 * @return 解码文本
*/ */
public static String decode(final InputStream qrCodeInputstream) { public static String decode(final InputStream qrCodeInputstream) {
return decode(ImgUtil.read(qrCodeInputstream)); BufferedImage image = null;
try{
image = ImgUtil.read(qrCodeInputstream);
return decode(image);
} finally {
ImgUtil.flush(image);
}
} }
/** /**
@@ -211,7 +242,13 @@ public class QrCodeUtil {
* @return 解码文本 * @return 解码文本
*/ */
public static String decode(final File qrCodeFile) { public static String decode(final File qrCodeFile) {
return decode(ImgUtil.read(qrCodeFile)); BufferedImage image = null;
try{
image = ImgUtil.read(qrCodeFile);
return decode(image);
} finally {
ImgUtil.flush(image);
}
} }
/** /**

View File

@@ -32,10 +32,7 @@ import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter; import java.awt.image.CropImageFilter;
import java.awt.image.ImageFilter; import java.awt.image.ImageFilter;
import java.io.File; import java.io.*;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.URL; import java.net.URL;
import java.nio.file.Path; import java.nio.file.Path;
@@ -45,7 +42,7 @@ import java.nio.file.Path;
* @author looly * @author looly
* @since 4.1.5 * @since 4.1.5
*/ */
public class Img implements Serializable { public class Img implements Flushable, Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final BufferedImage srcImage; private final BufferedImage srcImage;
@@ -810,6 +807,12 @@ public class Img implements Serializable {
} }
} }
@Override
public void flush() {
ImgUtil.flush(this.srcImage);
ImgUtil.flush(this.targetImage);
}
// ---------------------------------------------------------------------------------------------------------------- Private method start // ---------------------------------------------------------------------------------------------------------------- Private method start
/** /**

View File

@@ -20,6 +20,7 @@ import org.dromara.hutool.core.io.file.FileUtil;
import org.dromara.hutool.core.io.resource.Resource; import org.dromara.hutool.core.io.resource.Resource;
import org.dromara.hutool.core.io.stream.FastByteArrayOutputStream; import org.dromara.hutool.core.io.stream.FastByteArrayOutputStream;
import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.lang.tuple.Pair;
import org.dromara.hutool.core.math.NumberUtil; import org.dromara.hutool.core.math.NumberUtil;
import org.dromara.hutool.core.net.url.UrlUtil; import org.dromara.hutool.core.net.url.UrlUtil;
import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.StrUtil;
@@ -1550,12 +1551,12 @@ public class ImgUtil {
* *
* @param image {@link Image} * @param image {@link Image}
* @param imageType 图片类型(图片扩展名) * @param imageType 图片类型(图片扩展名)
* @param destImageStream 写出到的目标流 * @param targetImageStream 写出到的目标流
* @throws IORuntimeException IO异常 * @throws IORuntimeException IO异常
* @since 3.1.2 * @since 3.1.2
*/ */
public static void write(final Image image, final String imageType, final ImageOutputStream destImageStream) throws IORuntimeException { public static void write(final Image image, final String imageType, final ImageOutputStream targetImageStream) throws IORuntimeException {
write(image, imageType, destImageStream, 1); write(image, imageType, targetImageStream, 1);
} }
/** /**
@@ -1760,6 +1761,39 @@ public class ImgUtil {
} }
return null; return null;
} }
/**
* 通过 {@link ImageInputStream} 获取对应类型的宽和高
*
* @param imageStream {@link ImageInputStream}
* @param type 图片类型
* @return 宽和高
* @since 6.0.0
*/
public static Pair<Integer, Integer> getWidthAndHeight(final InputStream imageStream, final String type) {
return getWidthAndHeight(getImageInputStream(imageStream), type);
}
/**
* 通过 {@link ImageInputStream} 获取对应类型的宽和高
*
* @param imageStream {@link ImageInputStream}
* @param type 图片类型
* @return 宽和高
* @since 6.0.0
*/
public static Pair<Integer, Integer> getWidthAndHeight(final ImageInputStream imageStream, final String type) {
final ImageReader reader = getReader(type);
if (null != reader) {
reader.setInput(imageStream, true);
try {
return Pair.of(reader.getWidth(0), reader.getHeight(0));
} catch (final IOException e) {
throw new IORuntimeException(e);
}
}
return null;
}
// endregion // endregion
// region ----- getImage and getPoint // region ----- getImage and getPoint
@@ -2008,4 +2042,16 @@ public class ImgUtil {
new FilteredImageSource(image.getSource(), filter)); new FilteredImageSource(image.getSource(), filter));
} }
// endregion // endregion
/**
* 刷新和释放{@link Image} 资源
*
* @param image {@link Image}
* @since 5.8.27
*/
public static void flush(final Image image) {
if (null != image) {
image.flush();
}
}
} }