Basta ya de indagar por otras páginas porque llegaste al lugar correcto, tenemos la solución que deseas sin problema.
Solución:
El puntero del extractor de metadatos que proporcionó Roger Rowland resolvió el problema. Lo estoy publicando aquí para referencia futura:
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));
Tuve algunos problemas para que funcionen algunos de los casos de interruptores. Incluso cuando no había que realizar ninguna rotación, AffineTransform crearía una nueva imagen con un espacio negro en la imagen y cortaría algunas de las dimensiones. Aprovechando la respuesta aceptada aquí, utilicé la clase de extractor de metadatos para determinar cuál debería ser la orientación. Luego utilicé la biblioteca Imgscalr para escalar y rotar.
La solución completa que funcionó para mí se puede ver a continuación. Gracias Tapas Bose por la solución original. ¡Espero que esto ayude a cualquiera!
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");
Puedes añadir valor a nuestro contenido informacional añadiendo tu experiencia en las críticas.