I had some issues getting some of the switch cases to work. Even when there was no rotation to be done, the AffineTransform would create a new image with black space in the image and would chop off some of the dimensions. Piggy backing off of the accepted answer here, I used the metadata-extractor class to determine what the orientation should be. Then I used the Imgscalr library for scaling and rotation.
The complete solution that worked for me can be seen below. Thank you Tapas Bose for the original solution. I hope that this helps anyone!
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");
}
convert image -auto-orient result
. see imagemagick.org/script/command-line-options.php#auto-orient – Matingconvert image -format "%[EXIF:orientation]" info:
to see if your image has such. Alternately, you can doidentify -verbose image
and look at the long listing of information for the EXIF tags, if they exist. If the imaged does not have EXIF orientation, your problem becomes much more difficult. You would likely need some deep learning code, but I have not seen anything like that, though I have not searched for such. – Mating