diff --git a/hutool-swing/pom.xml b/hutool-swing/pom.xml index 5b088218a..c0c25192f 100755 --- a/hutool-swing/pom.xml +++ b/hutool-swing/pom.xml @@ -14,7 +14,7 @@ hutool-swing ${project.artifactId} - Hutool swing桌面相关封装 + Hutool swing桌面和图片多媒体相关封装 cn.hutool.swing @@ -26,6 +26,7 @@ hutool-core ${project.parent.version} + com.drewnoakes metadata-extractor diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgMetaUtil.java b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgMetaUtil.java new file mode 100644 index 000000000..68a8e0594 --- /dev/null +++ b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgMetaUtil.java @@ -0,0 +1,125 @@ +package cn.hutool.swing.img; + +import cn.hutool.core.exceptions.UtilException; +import cn.hutool.core.io.IORuntimeException; +import com.drew.imaging.ImageMetadataReader; +import com.drew.imaging.ImageProcessingException; +import com.drew.metadata.Directory; +import com.drew.metadata.Metadata; +import com.drew.metadata.Tag; + +import javax.imageio.ImageIO; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +/** + * 图片元信息工具类
+ * 借助metadata-extractor完成图片元信息的读取,如旋转角度等问题 + * + * @author wdz + * @since 5.8.13 + */ +public class ImgMetaUtil { + + /** + * 纠正图片旋转
+ * 通过读取图片元数据信息获取旋转角度,然后根据旋转角度修正图片的角度 + * + * @param f 图片文件 + * @return {@link BufferedImage} + * @throws IOException IO异常 + */ + public static BufferedImage correctBufferImg(final File file) throws IOException { + // 获取偏转角度 + final int orientation = getOrientation(file); + + + // 原始图片缓存 + final BufferedImage srcImg = ImageIO.read(file); + //如果不偏转,直接返回即可 + if (orientation != 90 && orientation != 270) { + return srcImg; + } + + + // 宽高互换 + // 原始宽度 + final int imgWidth = srcImg.getHeight(); + // 原始高度 + final int imgHeight = srcImg.getWidth(); + + // 中心点位置 + final double centerWidth = ((double) imgWidth) / 2; + final double centerHeight = ((double) imgHeight) / 2; + + // 图片缓存 + final BufferedImage targetImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); + + // 旋转对应角度 + final Graphics2D g = targetImg.createGraphics(); + g.rotate(Math.toRadians(orientation), centerWidth, centerHeight); + g.drawImage(srcImg, (imgWidth - srcImg.getWidth()) / 2, (imgHeight - srcImg.getHeight()) / 2, null); + g.rotate(Math.toRadians(-orientation), centerWidth, centerHeight); + g.dispose(); + return targetImg; + } + + /** + * 获取图片文件旋转角度 + * + * @param file 上传图片 + * @return 旋转角度 + * @throws IORuntimeException IO异常 + */ + public static int getOrientation(final File file) throws IORuntimeException { + final Metadata metadata; + try { + metadata = ImageMetadataReader.readMetadata(file); + } catch (final ImageProcessingException e) { + throw new UtilException(e); + } catch (final IOException e) { + throw new RuntimeException(e); + } + return getOrientation(metadata); + } + + /** + * 获取图片旋转角度 + * + * @param in 图片流 + * @return 旋转角度 + * @throws IORuntimeException IO异常 + */ + public static int getOrientation(final InputStream in) throws IORuntimeException { + final Metadata metadata; + try { + metadata = ImageMetadataReader.readMetadata(in); + } catch (final ImageProcessingException e) { + throw new UtilException(e); + } catch (final IOException e) { + throw new RuntimeException(e); + } + return getOrientation(metadata); + } + + private static int getOrientation(final Metadata metadata) { + for (final Directory directory : metadata.getDirectories()) { + for (final Tag tag : directory.getTags()) { + if ("Orientation".equals(tag.getTagName())) { + final String orientation = tag.getDescription(); + if (orientation.contains("90")) { + return 90; + } else if (orientation.contains("180")) { + return 180; + } else if (orientation.contains("270")) { + return 270; + } + } + } + } + return 0; + } +} diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgRevolveUtil.java b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgRevolveUtil.java deleted file mode 100644 index 42e355471..000000000 --- a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgRevolveUtil.java +++ /dev/null @@ -1,88 +0,0 @@ -package cn.hutool.swing.img; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IORuntimeException; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; - -import com.drew.imaging.ImageMetadataReader; -import com.drew.imaging.ImageProcessingException; -import com.drew.metadata.Directory; -import com.drew.metadata.Metadata; -import com.drew.metadata.Tag; - -/** - * 图片避免旋转工具类 - * - *@Date: 2023/2/28 19:21
- * @author wdz - * @since 5.8.13 - */ -public class ImgRevolveUtil { - /** - * 纠正图片旋转 - * - * @param srcFile - */ - public static BufferedImage correctBufferImg(File srcFile) throws IOException, ImageProcessingException { - // 获取偏转角度 - int angle = getAngle(srcFile); - //如果不偏转,直接返回即可 - if (angle != 90 && angle != 270) { - return ImageIO.read(srcFile); - } - - // 原始图片缓存 - BufferedImage srcImg = ImageIO.read(srcFile); - - // 宽高互换 - // 原始宽度 - int imgWidth = srcImg.getHeight(); - // 原始高度 - int imgHeight = srcImg.getWidth(); - - // 中心点位置 - double centerWidth = ((double) imgWidth) / 2; - double centerHeight = ((double) imgHeight) / 2; - - // 图片缓存 - BufferedImage targetImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); - - // 旋转对应角度 - Graphics2D g = targetImg.createGraphics(); - g.rotate(Math.toRadians(angle), centerWidth, centerHeight); - g.drawImage(srcImg, (imgWidth - srcImg.getWidth()) / 2, (imgHeight - srcImg.getHeight()) / 2, null); - g.rotate(Math.toRadians(-angle), centerWidth, centerHeight); - g.dispose(); - return targetImg; - } - - - /** - * 获取图片旋转角度 - * - * @param file 上传图片 - * @return - */ - public static int getAngle(File file) throws ImageProcessingException, IOException { - Metadata metadata = ImageMetadataReader.readMetadata(file); - for (Directory directory : metadata.getDirectories()) { - for (Tag tag : directory.getTags()) { - if ("Orientation".equals(tag.getTagName())) { - String orientation = tag.getDescription(); - if (orientation.contains("90")) { - return 90; - } else if (orientation.contains("180")) { - return 180; - } else if (orientation.contains("270")) { - return 270; - } - } - } - } - return 0; - } -} diff --git a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java index 08ee070a4..1ab5ab80b 100755 --- a/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java +++ b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgUtil.java @@ -1631,7 +1631,7 @@ public class ImgUtil { public static BufferedImage read(final File imageFile) { final BufferedImage result; try { - result = ImgRevolveUtil.correctBufferImg(imageFile); + result = ImageIO.read(imageFile); } catch (final IOException e) { throw new IORuntimeException(e); }