diff --git a/CHANGELOG.md b/CHANGELOG.md
index cc5f047c5..987bc7c9a 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
-# 5.8.23(2023-10-25)
+# 5.8.23(2023-10-27)
### 🐣新特性
* 【json 】 改进TemporalAccessorSerializer支持dayOfMonth和month枚举名(issue#I82AM8@Gitee)
@@ -21,6 +21,7 @@
* 【core 】 修复DataSize.parse(size)不支持空格问题(issue#I88Z4Z@Gitee)
* 【http 】 修复SimpleServer在添加的HttpFilter中有获取请求参数时报错问题(issue#3343@Github)
* 【http 】 修复options请求无响应体问题
+* 【core 】 ImgUtil的sliceByRowsAndCols背景无法透明问题(issue#3347@Gitee)
-------------------------------------------------------------------------------------------------------------
# 5.8.22(2023-09-13)
diff --git a/hutool-core/src/main/java/cn/hutool/core/img/Img.java b/hutool-core/src/main/java/cn/hutool/core/img/Img.java
index bfa3ca04f..375241b14 100755
--- a/hutool-core/src/main/java/cn/hutool/core/img/Img.java
+++ b/hutool-core/src/main/java/cn/hutool/core/img/Img.java
@@ -133,7 +133,7 @@ public class Img implements Serializable {
* @return Img
*/
public static Img from(Image image) {
- return new Img(ImgUtil.toBufferedImage(image));
+ return new Img(ImgUtil.castToBufferedImage(image, ImgUtil.IMAGE_TYPE_JPG));
}
/**
diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java
index 536897c00..a27238a39 100755
--- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java
@@ -455,11 +455,7 @@ public class ImgUtil {
* @param cols 目标切片列数。默认2,必须是范围 [1, 20] 之内
*/
public static void sliceByRowsAndCols(File srcImageFile, File destDir, String format, int rows, int cols) {
- try {
- sliceByRowsAndCols(ImageIO.read(srcImageFile), destDir, format, rows, cols);
- } catch (IOException e) {
- throw new IORuntimeException(e);
- }
+ sliceByRowsAndCols(read(srcImageFile), destDir, format, rows, cols);
}
/**
@@ -491,32 +487,27 @@ public class ImgUtil {
throw new IllegalArgumentException("Destination Dir must be a Directory !");
}
- try {
- if (rows <= 0 || rows > 20) {
- rows = 2; // 切片行数
- }
- if (cols <= 0 || cols > 20) {
- cols = 2; // 切片列数
- }
- // 读取源图像
- final BufferedImage bi = toBufferedImage(srcImage);
- int srcWidth = bi.getWidth(); // 源图宽度
- int srcHeight = bi.getHeight(); // 源图高度
+ if (rows <= 0 || rows > 20) {
+ rows = 2; // 切片行数
+ }
+ if (cols <= 0 || cols > 20) {
+ cols = 2; // 切片列数
+ }
+ // 读取源图像
+ int srcWidth = srcImage.getWidth(null); // 源图宽度
+ int srcHeight = srcImage.getHeight(null); // 源图高度
- int destWidth = NumberUtil.partValue(srcWidth, cols); // 每张切片的宽度
- int destHeight = NumberUtil.partValue(srcHeight, rows); // 每张切片的高度
+ int destWidth = NumberUtil.partValue(srcWidth, cols); // 每张切片的宽度
+ int destHeight = NumberUtil.partValue(srcHeight, rows); // 每张切片的高度
- // 循环建立切片
- Image tag;
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < cols; j++) {
- tag = cut(bi, new Rectangle(j * destWidth, i * destHeight, destWidth, destHeight));
- // 输出为文件
- ImageIO.write(toRenderedImage(tag), format, new File(destDir, "_r" + i + "_c" + j + "." + format));
- }
+ // 循环建立切片
+ Image tag;
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ tag = cut(srcImage, new Rectangle(j * destWidth, i * destHeight, destWidth, destHeight));
+ // 输出为文件
+ write(tag, new File(destDir, "_r" + i + "_c" + j + "." + format));
}
- } catch (IOException e) {
- throw new IORuntimeException(e);
}
}
@@ -573,8 +564,9 @@ public class ImgUtil {
* @since 4.1.14
*/
public static void convert(Image srcImage, String formatName, ImageOutputStream destImageStream, boolean isSrcPng) {
+ final BufferedImage src = toBufferedImage(srcImage, isSrcPng ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB);
try {
- ImageIO.write(isSrcPng ? copyImage(srcImage, BufferedImage.TYPE_INT_RGB) : toBufferedImage(srcImage), formatName, destImageStream);
+ ImageIO.write(src, formatName, destImageStream);
} catch (IOException e) {
throw new IORuntimeException(e);
}
@@ -1157,13 +1149,11 @@ public class ImgUtil {
* @param img {@link Image}
* @return {@link BufferedImage}
* @since 4.3.2
+ * @deprecated 改用 {@link #castToRenderedImage(Image, String)}
*/
+ @Deprecated
public static RenderedImage toRenderedImage(Image img) {
- if (img instanceof RenderedImage) {
- return (RenderedImage) img;
- }
-
- return copyImage(img, BufferedImage.TYPE_INT_RGB);
+ return castToRenderedImage(img, IMAGE_TYPE_JPG);
}
/**
@@ -1172,13 +1162,44 @@ public class ImgUtil {
*
* @param img {@link Image}
* @return {@link BufferedImage}
+ * @deprecated 改用 {@link #castToBufferedImage(Image, String)}
*/
+ @Deprecated
public static BufferedImage toBufferedImage(Image img) {
+ return castToBufferedImage(img, IMAGE_TYPE_JPG);
+ }
+
+ /**
+ * {@link Image} 转 {@link RenderedImage}
+ * 首先尝试强转,否则新建一个{@link BufferedImage}后重新绘制,使用 {@link BufferedImage#TYPE_INT_RGB} 模式。
+ *
+ * @param img {@link Image}
+ * @param imageType 目标图片类型,例如jpg或png等
+ * @return {@link BufferedImage}
+ * @since 4.3.2
+ */
+ public static RenderedImage castToRenderedImage(final Image img, final String imageType) {
+ if (img instanceof RenderedImage) {
+ return (RenderedImage) img;
+ }
+
+ return toBufferedImage(img, imageType);
+ }
+
+ /**
+ * {@link Image} 转 {@link BufferedImage}
+ * 首先尝试强转,否则新建一个{@link BufferedImage}后重新绘制,使用 imageType 模式
+ *
+ * @param img {@link Image}
+ * @param imageType 目标图片类型,例如jpg或png等
+ * @return {@link BufferedImage}
+ */
+ public static BufferedImage castToBufferedImage(final Image img, final String imageType) {
if (img instanceof BufferedImage) {
return (BufferedImage) img;
}
- return copyImage(img, BufferedImage.TYPE_INT_RGB);
+ return toBufferedImage(img, imageType);
}
/**
@@ -1687,7 +1708,7 @@ public class ImgUtil {
}
writer.setOutput(output);
- final RenderedImage renderedImage = toRenderedImage(image);
+ final RenderedImage renderedImage = castToRenderedImage(image, IMAGE_TYPE_JPG);
// 设置质量
ImageWriteParam imgWriteParams = null;
if (quality > 0 && quality < 1) {
diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java
index d53e28b0a..c65d6cc93 100755
--- a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java
@@ -48,7 +48,9 @@ public class ImgUtilTest {
@Test
@Ignore
public void cutTest() {
- ImgUtil.cut(FileUtil.file("d:/face.jpg"), FileUtil.file("d:/face_result.jpg"), new Rectangle(200, 200, 100, 100));
+ ImgUtil.cut(FileUtil.file("d:/test/hutool.png"),
+ FileUtil.file("d:/test/result.png"),
+ new Rectangle(0, 0, 400, 240));
}
@Test
@@ -92,6 +94,14 @@ public class ImgUtilTest {
ImgUtil.sliceByRowsAndCols(FileUtil.file("d:/temp/2.png"), FileUtil.file("d:/temp/slice/png"),ImgUtil.IMAGE_TYPE_PNG, 1, 5);
}
+ @Test
+ @Ignore
+ public void sliceByRowsAndColsTest2() {
+ ImgUtil.sliceByRowsAndCols(
+ FileUtil.file("d:/test/hutool.png"),
+ FileUtil.file("d:/test/dest"), ImgUtil.IMAGE_TYPE_PNG, 1, 5);
+ }
+
@Test
@Ignore
public void convertTest() {