From 7cbba42e942250f5e30e09b11d227a3203ed33c9 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 11 Aug 2021 00:27:31 +0800 Subject: [PATCH] fix methods --- .../src/main/java/cn/hutool/core/img/Img.java | 41 ++++++++----------- .../main/java/cn/hutool/core/img/ImgUtil.java | 15 +++++++ 2 files changed, 32 insertions(+), 24 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 a97557337..4bf30ed20 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/Img.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/Img.java @@ -22,14 +22,12 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Stroke; -import java.awt.Toolkit; import java.awt.color.ColorSpace; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.awt.image.CropImageFilter; -import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.io.File; import java.io.InputStream; @@ -271,10 +269,11 @@ public class Img implements Serializable { scaleType = Image.SCALE_DEFAULT; } - double sx = NumberUtil.div(width, srcWidth); - double sy = NumberUtil.div(height, srcHeight); if (ImgUtil.IMAGE_TYPE_PNG.equals(this.targetImageType)) { + // png特殊处理,借助AffineTransform可以实现透明度保留 + final double sx = NumberUtil.div(width, srcWidth);// 宽度缩放比 + final double sy = NumberUtil.div(height, srcHeight); // 高度缩放比 this.targetImage = ImgUtil.transform(AffineTransform.getScaleInstance(sx, sy), ImgUtil.toBufferedImage(srcImg, this.targetImageType)); } else { @@ -345,7 +344,7 @@ public class Img implements Serializable { fixRectangle(rectangle, srcImage.getWidth(null), srcImage.getHeight(null)); final ImageFilter cropFilter = new CropImageFilter(rectangle.x, rectangle.y, rectangle.width, rectangle.height); - this.targetImage = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(srcImage.getSource(), cropFilter)); + this.targetImage = ImgUtil.filter(cropFilter, srcImage); return this; } @@ -420,7 +419,7 @@ public class Img implements Serializable { } /** - * 彩色转为黑白 + * 彩色转为灰度 * * @return this */ @@ -440,8 +439,7 @@ public class Img implements Serializable { } /** - * 给图片添加文字水印
- * 此方法并不关闭流 + * 给图片添加文字水印 * * @param pressText 水印文字 * @param color 水印的字体颜色 @@ -602,11 +600,12 @@ public class Img implements Serializable { * @return 处理过的图片 */ public Image getImg() { - return null == this.targetImage ? this.srcImage : this.targetImage; + return getValidSrcImg(); } /** - * 写出图像 + * 写出图像为结果设置格式
+ * 结果类型设定见{@link #setTargetImageType(String)} * * @param out 写出到的目标流 * @return 是否成功写出,如果返回false表示未找到合适的Writer @@ -617,7 +616,8 @@ public class Img implements Serializable { } /** - * 写出图像为PNG格式 + * 写出图像为结果设置格式
+ * 结果类型设定见{@link #setTargetImageType(String)} * * @param targetImageStream 写出到的目标流 * @return 是否成功写出,如果返回false表示未找到合适的Writer @@ -667,7 +667,7 @@ public class Img implements Serializable { * * @param backgroundImg 背景图片 * @param img 要绘制的图片 - * @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算 + * @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算(如果positionBaseCentre为true) * @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 * @return 绘制后的背景 */ @@ -675,13 +675,7 @@ public class Img implements Serializable { final Graphics2D g = backgroundImg.createGraphics(); GraphicsUtil.setAlpha(g, alpha); - Point point; - if (positionBaseCentre) { - point = ImgUtil.getPointBaseCentre(rectangle, backgroundImg.getWidth(), backgroundImg.getHeight()); - } else { - point = new Point(rectangle.x, rectangle.y); - } - rectangle.setLocation(point.x, point.y); + fixRectangle(rectangle, backgroundImg.getWidth(), backgroundImg.getHeight()); GraphicsUtil.drawImg(g, img, rectangle); g.dispose(); @@ -725,7 +719,8 @@ public class Img implements Serializable { } /** - * 修正矩形框位置,如果{@link Img#setPositionBaseCentre(boolean)} 设为{@code true},则坐标修正为基于图形中心,否则基于左上角 + * 修正矩形框位置,如果{@link Img#setPositionBaseCentre(boolean)} 设为{@code true},
+ * 则坐标修正为基于图形中心,否则基于左上角 * * @param rectangle 矩形 * @param baseWidth 参考宽 @@ -735,11 +730,9 @@ public class Img implements Serializable { */ private Rectangle fixRectangle(Rectangle rectangle, int baseWidth, int baseHeight) { if (this.positionBaseCentre) { + final Point pointBaseCentre = ImgUtil.getPointBaseCentre(rectangle, baseWidth, baseHeight); // 修正图片位置从背景的中心计算 - rectangle.setLocation(// - rectangle.x + (Math.abs(baseWidth - rectangle.width) / 2), // - rectangle.y + (Math.abs(baseHeight - rectangle.height) / 2)// - ); + rectangle.setLocation(pointBaseCentre.x, pointBaseCentre.y); } return rectangle; } 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 a990f96c6..72caa9ae4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java @@ -39,6 +39,8 @@ import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ColorConvertOp; import java.awt.image.ColorModel; +import java.awt.image.FilteredImageSource; +import java.awt.image.ImageFilter; import java.awt.image.RenderedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -2190,4 +2192,17 @@ public class ImgUtil { public static BufferedImage filter(BufferedImageOp op, BufferedImage image) { return op.filter(image, null); } + + /** + * 图片滤镜,借助 {@link ImageFilter}实现,实现不同的图片滤镜 + * + * @param filter 滤镜实现 + * @param image 图片 + * @return 滤镜后的图片 + * @since 5.7.8 + */ + public static Image filter(ImageFilter filter, Image image){ + return Toolkit.getDefaultToolkit().createImage( + new FilteredImageSource(image.getSource(), filter)); + } }