import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.IImageMetadata;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.common.RationalNumber;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter.Options;
import org.apache.commons.imaging.formats.jpeg.exif.ExifTagConstants;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ExifAutoRotateToBufferedImageExample {
public static void main(String[] args) {
try {
File inputFile = new File("deinBild.jpg");
// Lade das Bild und seine Metadaten
IImageMetadata metadata = Imaging.getMetadata(inputFile);
// Lade das Bild in ein BufferedImage
BufferedImage originalImage = Imaging.getBufferedImage(inputFile);
// Überprüfe, ob das Bild Exif-Metadaten enthält und ob es gedreht werden muss
if (metadata instanceof JpegImageMetadata) {
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
Integer orientation = jpegMetadata.findEXIFValueWithExactMatch(ExifTagConstants.EXIF_TAG_ORIENTATION).getIntValue();
if (orientation != null && orientation != 1) {
// Das Bild muss gedreht werden
originalImage = rotateImage(originalImage, orientation);
}
}
// Speichere das gedrehte Bild in ein neues BufferedImage
BufferedImage rotatedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), originalImage.getType());
Graphics2D g2d = rotatedImage.createGraphics();
g2d.drawImage(originalImage, 0, 0, null);
g2d.dispose();
// Jetzt hast du das Bild in einem BufferedImage, das die Exif-Metadaten berücksichtigt
// Verwende rotatedImage für weitere Verarbeitungszwecke
} catch (ImageReadException | IOException e) {
e.printStackTrace();
}
}
// Methode zum Drehen des Bildes basierend auf der Ausrichtungsinformation
private static BufferedImage rotateImage(BufferedImage originalImage, int orientation) {
AffineTransform transform = new AffineTransform();
switch (orientation) {
case 2:
transform.scale(-1, 1);
break;
case 3:
transform.rotate(Math.PI, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
break;
case 4:
transform.rotate(Math.PI, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
transform.scale(-1, 1);
break;
case 5:
transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
transform.scale(-1, 1);
break;
case 6:
transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
break;
case 7:
transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
transform.scale(-1, 1);
break;
case 8:
transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
break;
default:
break;
}
BufferedImage rotatedImage = new BufferedImage(originalImage.getHeight(), originalImage.getWidth(), originalImage.getType());
Graphics2D g2d = rotatedImage.createGraphics();
g2d.setTransform(transform);
g2d.drawImage(originalImage, 0, 0, null);
g2d.dispose();
return rotatedImage;
}
}