From 6c32295a37d1403972c6154d5f5adfae324d854c Mon Sep 17 00:00:00 2001 From: hiqiuyi <178673693@qq.com> Date: Thu, 4 Aug 2022 14:49:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E5=AE=9A=E5=8E=8B=E7=BC=A9=E5=90=8E?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9A=84=E8=83=8C=E6=99=AF=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/img/Img.java | 17 +++++- .../main/java/cn/hutool/core/img/ImgUtil.java | 59 ++++++++++++++++++- .../test/java/cn/hutool/core/img/ImgTest.java | 9 +++ 3 files changed, 82 insertions(+), 3 deletions(-) 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 754ce85ef..6cd1acba5 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 @@ -60,6 +60,10 @@ public class Img implements Serializable { * 图片输出质量,用于压缩 */ private float quality = -1; + /** + * 图片背景色 + */ + private Color backgroundColor; /** * 从Path读取图片并开始处理 @@ -216,6 +220,17 @@ public class Img implements Serializable { return this; } + /** + * 设置图片的背景色 + * + * @param backgroundColor{@link Color} 背景色 + * @return this + */ + public Img setBackgroundColor(Color backgroundColor) { + this.backgroundColor = backgroundColor; + return this; + } + /** * 缩放图像(按比例缩放) * @@ -709,7 +724,7 @@ public class Img implements Serializable { final Image targetImage = (null == this.targetImage) ? this.srcImage : this.targetImage; Assert.notNull(targetImage, "Target image is null !"); - return ImgUtil.write(targetImage, this.targetImageType, targetImageStream, this.quality); + return ImgUtil.write(targetImage, this.targetImageType, targetImageStream, this.quality, this.backgroundColor); } /** 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 3cdd781b2..0172c1191 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 @@ -1166,10 +1166,25 @@ public class ImgUtil { * @since 4.3.2 */ public static BufferedImage toBufferedImage(Image image, String imageType) { + return toBufferedImage(image, imageType, null); + } + + /** + * {@link Image} 转 {@link BufferedImage}
+ * 如果源图片的RGB模式与目标模式一致,则直接转换,否则重新绘制
+ * 默认的,png图片使用 {@link BufferedImage#TYPE_INT_ARGB}模式,其它使用 {@link BufferedImage#TYPE_INT_RGB} 模式 + * + * @param image {@link Image} + * @param imageType 目标图片类型,例如jpg或png等 + * @param backgroundColor 背景色{@link Color} + * @return {@link BufferedImage} + * @since 4.3.2 + */ + public static BufferedImage toBufferedImage(Image image, String imageType, Color backgroundColor) { final int type = IMAGE_TYPE_PNG.equalsIgnoreCase(imageType) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB; - return toBufferedImage(image, type); + return toBufferedImage(image, type, backgroundColor); } /** @@ -1195,6 +1210,30 @@ public class ImgUtil { return bufferedImage; } + /** + * {@link Image} 转 {@link BufferedImage}
+ * 如果源图片的RGB模式与目标模式一致,则直接转换,否则重新绘制 + * + * @param image {@link Image} + * @param imageType 目标图片类型,{@link BufferedImage}中的常量,例如黑白等 + * @param backgroundColor 背景色{@link Color} + * @return {@link BufferedImage} + * @since 5.4.7 + */ + public static BufferedImage toBufferedImage(Image image, int imageType, Color backgroundColor) { + BufferedImage bufferedImage; + if (image instanceof BufferedImage) { + bufferedImage = (BufferedImage) image; + if (imageType != bufferedImage.getType()) { + bufferedImage = copyImage(image, imageType, backgroundColor); + } + return bufferedImage; + } + + bufferedImage = copyImage(image, imageType, backgroundColor); + return bufferedImage; + } + /** * 将已有Image复制新的一份出来 * @@ -1562,11 +1601,27 @@ public class ImgUtil { * @since 4.3.2 */ public static boolean write(Image image, String imageType, ImageOutputStream destImageStream, float quality) throws IORuntimeException { + return write(image, imageType, destImageStream, quality, null); + } + + /** + * 写出图像为指定格式 + * + * @param image {@link Image} + * @param imageType 图片类型(图片扩展名) + * @param destImageStream 写出到的目标流 + * @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩 + * @param backgroundColor 背景色{@link Color} + * @return 是否成功写出,如果返回false表示未找到合适的Writer + * @throws IORuntimeException IO异常 + * @since 4.3.2 + */ + public static boolean write(Image image, String imageType, ImageOutputStream destImageStream, float quality, Color backgroundColor) throws IORuntimeException { if (StrUtil.isBlank(imageType)) { imageType = IMAGE_TYPE_JPG; } - final BufferedImage bufferedImage = toBufferedImage(image, imageType); + final BufferedImage bufferedImage = toBufferedImage(image, imageType, backgroundColor); final ImageWriter writer = getWriter(bufferedImage, imageType); return write(bufferedImage, writer, destImageStream, quality); } diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java index 09a52a681..2cd38cbfc 100755 --- a/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java @@ -26,6 +26,15 @@ public class ImgTest { Img.from(FileUtil.file("f:/test/4347273249269e3fb272341acc42d4e.jpg")).setQuality(0.8).write(FileUtil.file("f:/test/test_dest.jpg")); } + @Test + @Ignore + public void compressWithBackgroundColorTest() { + Img.from(FileUtil.file("D:/test/before_compress.png")) + .setBackgroundColor(Color.WHITE) + .setQuality(0.8) + .write(FileUtil.file("D:/test/after_compress.jpg")); + } + @Test @Ignore public void writeTest() {