如何确定和自动旋转图像?

我有一堆图像,其中一些图像必须旋转。

样品:

在此处输入图像描述

我想逆时针旋转此图像90°。

我用Google搜索知道如何旋转图像并找到许多链接和SO线程。 但是如何确定图像是否需要旋转 ? Picasa具有自动旋转function。 我想要有类似的function。

任何指针都对我很有帮助。

我找到了一个链接,但它与Android有关。

Roger Rowland提供的元数据提取器的指针解决了这个问题。 我在这里发布它以供将来参考:

import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import com.drew.imaging.ImageMetadataReader; import com.drew.metadata.Metadata; import com.drew.metadata.exif.ExifIFD0Directory; import com.drew.metadata.jpeg.JpegDirectory; public class Main { private static String inFilePath = "C:\\Users\\TapasB\\Desktop\\MHIS031522.jpg"; private static String outFilePath = "C:\\Users\\TapasB\\Desktop\\MHIS031522-rotated.jpg"; public static void main(String[] args) throws Exception { File imageFile = new File(inFilePath); BufferedImage originalImage = ImageIO.read(imageFile); Metadata metadata = ImageMetadataReader.readMetadata(imageFile); ExifIFD0Directory exifIFD0Directory = metadata.getDirectory(ExifIFD0Directory.class); JpegDirectory jpegDirectory = (JpegDirectory) metadata.getDirectory(JpegDirectory.class); int orientation = 1; try { orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION); } catch (Exception ex) { ex.printStackTrace(); } int width = jpegDirectory.getImageWidth(); int height = jpegDirectory.getImageHeight(); AffineTransform affineTransform = new AffineTransform(); switch (orientation) { case 1: break; case 2: // Flip X affineTransform.scale(-1.0, 1.0); affineTransform.translate(-width, 0); break; case 3: // PI rotation affineTransform.translate(width, height); affineTransform.rotate(Math.PI); break; case 4: // Flip Y affineTransform.scale(1.0, -1.0); affineTransform.translate(0, -height); break; case 5: // - PI/2 and Flip X affineTransform.rotate(-Math.PI / 2); affineTransform.scale(-1.0, 1.0); break; case 6: // -PI/2 and -width affineTransform.translate(height, 0); affineTransform.rotate(Math.PI / 2); break; case 7: // PI/2 and Flip affineTransform.scale(-1.0, 1.0); affineTransform.translate(-height, 0); affineTransform.translate(0, width); affineTransform.rotate(3 * Math.PI / 2); break; case 8: // PI / 2 affineTransform.translate(0, width); affineTransform.rotate(3 * Math.PI / 2); break; default: break; } AffineTransformOp affineTransformOp = new AffineTransformOp(affineTransform, AffineTransformOp.TYPE_BILINEAR); BufferedImage destinationImage = new BufferedImage(originalImage.getHeight(), originalImage.getWidth(), originalImage.getType()); destinationImage = affineTransformOp.filter(originalImage, destinationImage); ImageIO.write(destinationImage, "jpg", new File(outFilePath)); } } 

我有一些问题让一些开关案例起作用。 即使没有旋转,AffineTransform也会在图像中创建一个带有黑色空间的新图像,并会切掉一些尺寸。 小猪退出接受的答案,我使用元数据提取器类来确定方向应该是什么。 然后我使用Imgscalr库进行缩放和旋转。

对我有用的完整解决方案如下所示。 谢谢Tapas Bose的原始解决方案。 我希望这对任何人都有帮助!

 BufferedImage originalImage = Utils.prepareBufferedImage(fileUpload.getFile_data(), fileUpload.getFile_type()); BufferedImage scaledImg = Scalr.resize(originalImage, 200); // ---- Begin orientation handling ---- Metadata metadata = ImageMetadataReader.readMetadata(fileUpload.getFile_data()); ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); int orientation = Integer.parseInt(id); try { orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION); } catch (Exception ex) { logger.debug("No EXIF information found for image: " + fileUpload.getFile_name()); } switch (orientation) { case 1: break; case 2: // Flip X scaledImg = Scalr.rotate(scaledImg, Rotation.FLIP_HORZ); break; case 3: // PI rotation scaledImg = Scalr.rotate(scaledImg, Rotation.CW_180); break; case 4: // Flip Y scaledImg = Scalr.rotate(scaledImg, Rotation.FLIP_VERT); break; case 5: // - PI/2 and Flip X scaledImg = Scalr.rotate(scaledImg, Rotation.CW_90); scaledImg = Scalr.rotate(scaledImg, Rotation.FLIP_HORZ); break; case 6: // -PI/2 and -width scaledImg = Scalr.rotate(scaledImg, Rotation.CW_90); break; case 7: // PI/2 and Flip scaledImg = Scalr.rotate(scaledImg, Rotation.CW_90); scaledImg = Scalr.rotate(scaledImg, Rotation.FLIP_VERT); break; case 8: // PI / 2 scaledImg = Scalr.rotate(scaledImg, Rotation.CW_270); break; default: break; } // ---- End orientation handling ---- if(fileUpload.getFile_type().toLowerCase().contains("jpeg")){ ImageIO.write(scaledImg, "jpeg", fileUpload.getFile_data()); user.setProfile_picture_ext("jpg"); } else{ Sanselan.writeImage(scaledImg, fileUpload.getFile_data(), ImageFormat.IMAGE_FORMAT_PNG, null); user.setProfile_picture_ext("png"); }