ImgUtil的sliceByRowsAndCols背景无法透明问题

This commit is contained in:
Looly 2023-10-27 21:48:02 +08:00
parent 51488af226
commit fcd3d9f7d0
4 changed files with 71 additions and 39 deletions

View File

@ -2,7 +2,7 @@
# 🚀Changelog # 🚀Changelog
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.23(2023-10-25) # 5.8.23(2023-10-27)
### 🐣新特性 ### 🐣新特性
* 【json 】 改进TemporalAccessorSerializer支持dayOfMonth和month枚举名issue#I82AM8@Gitee * 【json 】 改进TemporalAccessorSerializer支持dayOfMonth和month枚举名issue#I82AM8@Gitee
@ -21,6 +21,7 @@
* 【core 】 修复DataSize.parse(size)不支持空格问题issue#I88Z4Z@Gitee * 【core 】 修复DataSize.parse(size)不支持空格问题issue#I88Z4Z@Gitee
* 【http 】 修复SimpleServer在添加的HttpFilter中有获取请求参数时报错问题issue#3343@Github * 【http 】 修复SimpleServer在添加的HttpFilter中有获取请求参数时报错问题issue#3343@Github
* 【http 】 修复options请求无响应体问题 * 【http 】 修复options请求无响应体问题
* 【core 】 ImgUtil的sliceByRowsAndCols背景无法透明问题issue#3347@Gitee
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.22(2023-09-13) # 5.8.22(2023-09-13)

View File

@ -133,7 +133,7 @@ public class Img implements Serializable {
* @return Img * @return Img
*/ */
public static Img from(Image image) { public static Img from(Image image) {
return new Img(ImgUtil.toBufferedImage(image)); return new Img(ImgUtil.castToBufferedImage(image, ImgUtil.IMAGE_TYPE_JPG));
} }
/** /**

View File

@ -455,11 +455,7 @@ public class ImgUtil {
* @param cols 目标切片列数默认2必须是范围 [1, 20] 之内 * @param cols 目标切片列数默认2必须是范围 [1, 20] 之内
*/ */
public static void sliceByRowsAndCols(File srcImageFile, File destDir, String format, int rows, int cols) { public static void sliceByRowsAndCols(File srcImageFile, File destDir, String format, int rows, int cols) {
try { sliceByRowsAndCols(read(srcImageFile), destDir, format, rows, cols);
sliceByRowsAndCols(ImageIO.read(srcImageFile), destDir, format, rows, cols);
} catch (IOException e) {
throw new IORuntimeException(e);
}
} }
/** /**
@ -491,7 +487,6 @@ public class ImgUtil {
throw new IllegalArgumentException("Destination Dir must be a Directory !"); throw new IllegalArgumentException("Destination Dir must be a Directory !");
} }
try {
if (rows <= 0 || rows > 20) { if (rows <= 0 || rows > 20) {
rows = 2; // 切片行数 rows = 2; // 切片行数
} }
@ -499,9 +494,8 @@ public class ImgUtil {
cols = 2; // 切片列数 cols = 2; // 切片列数
} }
// 读取源图像 // 读取源图像
final BufferedImage bi = toBufferedImage(srcImage); int srcWidth = srcImage.getWidth(null); // 源图宽度
int srcWidth = bi.getWidth(); // 源图宽度 int srcHeight = srcImage.getHeight(null); // 源图高度
int srcHeight = bi.getHeight(); // 源图高度
int destWidth = NumberUtil.partValue(srcWidth, cols); // 每张切片的宽度 int destWidth = NumberUtil.partValue(srcWidth, cols); // 每张切片的宽度
int destHeight = NumberUtil.partValue(srcHeight, rows); // 每张切片的高度 int destHeight = NumberUtil.partValue(srcHeight, rows); // 每张切片的高度
@ -510,14 +504,11 @@ public class ImgUtil {
Image tag; Image tag;
for (int i = 0; i < rows; i++) { for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) { for (int j = 0; j < cols; j++) {
tag = cut(bi, new Rectangle(j * destWidth, i * destHeight, destWidth, destHeight)); tag = cut(srcImage, new Rectangle(j * destWidth, i * destHeight, destWidth, destHeight));
// 输出为文件 // 输出为文件
ImageIO.write(toRenderedImage(tag), format, new File(destDir, "_r" + i + "_c" + j + "." + format)); write(tag, new File(destDir, "_r" + i + "_c" + j + "." + format));
} }
} }
} catch (IOException e) {
throw new IORuntimeException(e);
}
} }
// ---------------------------------------------------------------------------------------------------------------------- convert // ---------------------------------------------------------------------------------------------------------------------- convert
@ -573,8 +564,9 @@ public class ImgUtil {
* @since 4.1.14 * @since 4.1.14
*/ */
public static void convert(Image srcImage, String formatName, ImageOutputStream destImageStream, boolean isSrcPng) { 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 { try {
ImageIO.write(isSrcPng ? copyImage(srcImage, BufferedImage.TYPE_INT_RGB) : toBufferedImage(srcImage), formatName, destImageStream); ImageIO.write(src, formatName, destImageStream);
} catch (IOException e) { } catch (IOException e) {
throw new IORuntimeException(e); throw new IORuntimeException(e);
} }
@ -1157,13 +1149,11 @@ public class ImgUtil {
* @param img {@link Image} * @param img {@link Image}
* @return {@link BufferedImage} * @return {@link BufferedImage}
* @since 4.3.2 * @since 4.3.2
* @deprecated 改用 {@link #castToRenderedImage(Image, String)}
*/ */
@Deprecated
public static RenderedImage toRenderedImage(Image img) { public static RenderedImage toRenderedImage(Image img) {
if (img instanceof RenderedImage) { return castToRenderedImage(img, IMAGE_TYPE_JPG);
return (RenderedImage) img;
}
return copyImage(img, BufferedImage.TYPE_INT_RGB);
} }
/** /**
@ -1172,13 +1162,44 @@ public class ImgUtil {
* *
* @param img {@link Image} * @param img {@link Image}
* @return {@link BufferedImage} * @return {@link BufferedImage}
* @deprecated 改用 {@link #castToBufferedImage(Image, String)}
*/ */
@Deprecated
public static BufferedImage toBufferedImage(Image img) { public static BufferedImage toBufferedImage(Image img) {
return castToBufferedImage(img, IMAGE_TYPE_JPG);
}
/**
* {@link Image} {@link RenderedImage}<br>
* 首先尝试强转否则新建一个{@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}<br>
* 首先尝试强转否则新建一个{@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) { if (img instanceof BufferedImage) {
return (BufferedImage) img; return (BufferedImage) img;
} }
return copyImage(img, BufferedImage.TYPE_INT_RGB); return toBufferedImage(img, imageType);
} }
/** /**
@ -1687,7 +1708,7 @@ public class ImgUtil {
} }
writer.setOutput(output); writer.setOutput(output);
final RenderedImage renderedImage = toRenderedImage(image); final RenderedImage renderedImage = castToRenderedImage(image, IMAGE_TYPE_JPG);
// 设置质量 // 设置质量
ImageWriteParam imgWriteParams = null; ImageWriteParam imgWriteParams = null;
if (quality > 0 && quality < 1) { if (quality > 0 && quality < 1) {

View File

@ -48,7 +48,9 @@ public class ImgUtilTest {
@Test @Test
@Ignore @Ignore
public void cutTest() { 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 @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); 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 @Test
@Ignore @Ignore
public void convertTest() { public void convertTest() {