Лучший способ, который я нашел до сих пор, - это просто прочитать флаг ориентации, используя анализатор Exif java , а затем применить преобразование поворота к сгенерированному изображению, чтобы пиксели фактически вращались. Вот упрощенный пример:
byte[] sourceImage = yourCode();
int orientation = 1;
try {
Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(sourceImage));
orientation = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class).getInt(ExifIFD0Directory.TAG_ORIENTATION);
} catch (Throwable t) {
log.log(Level.INFO, "Failed to extract orientation", t);
}
Image destinationImage = ImagesServiceFactory.makeImage(sourceImage);
Transform rotate;
switch (orientation) {
case (EXIF_ORIENTATION_90): {
rotate = ImagesServiceFactory.makeRotate(90);
break;
}
case (EXIF_ORIENTATION_180): {
rotate = ImagesServiceFactory.makeRotate(180);
break;
}
case (EXIF_ORIENTATION_270): {
rotate = ImagesServiceFactory.makeRotate(270);
break;
}
default:
rotate = ImagesServiceFactory.makeRotate(0); // anything else, no rotate
}
destinationImage = ImagesServiceFactory.getImagesService().applyTransform(rotate, destinationImage);
final byte[] destinationImageData = destinationImage.getImageData();
Этого должно быть достаточно, чтобы вы пошли. Возможные значения ориентации Exif (если есть):
1 = Horizontal (normal)
2 = Mirror horizontal
3 = Rotate 180
4 = Mirror vertical
5 = Mirror horizontal and rotate 270 CW
6 = Rotate 90 CW
7 = Mirror horizontal and rotate 90 CW
8 = Rotate 270 CW
Я бы предпочел не делать этого, так как это требует ненужного преобразования и дополнительного шага разбора Exif. Лучшие решения приветствуются:)