diff --git a/hutool-swing/pom.xml b/hutool-swing/pom.xml index da2463e67..5b088218a 100755 --- a/hutool-swing/pom.xml +++ b/hutool-swing/pom.xml @@ -26,5 +26,11 @@ hutool-core ${project.parent.version} + + com.drewnoakes + metadata-extractor + 2.18.0 + true + 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 new file mode 100644 index 000000000..42e355471 --- /dev/null +++ b/hutool-swing/src/main/java/cn/hutool/swing/img/ImgRevolveUtil.java @@ -0,0 +1,88 @@ +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 1ab5ab80b..08ee070a4 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 = ImageIO.read(imageFile); + result = ImgRevolveUtil.correctBufferImg(imageFile); } catch (final IOException e) { throw new IORuntimeException(e); }