package io.lumify.imageMetadataHelper; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.ImageProcessingException; import com.drew.metadata.Metadata; import com.drew.metadata.exif.ExifIFD0Directory; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import io.lumify.imageMetadataExtractor.ImageTransform; import java.io.File; import java.io.IOException; public class ImageTransformExtractor { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(ImageTransformExtractor.class); public static ImageTransform getImageTransform(File localFile) { //new ImageTransform(false, 0) is the original image orientation, with no flip needed, and no rotation needed. ImageTransform imageTransform = new ImageTransform(false, 0); try { //Attempt to retrieve the metadata from the image. Metadata metadata = ImageMetadataReader.readMetadata(localFile); if (metadata != null) { ExifIFD0Directory exifDir = metadata.getDirectory(ExifIFD0Directory.class); if (exifDir != null) { Integer orientationInteger = exifDir.getInteger(ExifIFD0Directory.TAG_ORIENTATION); if (orientationInteger != null) { imageTransform = convertOrientationToTransform(orientationInteger); } } } } catch (ImageProcessingException e) { LOGGER.warn("drewnoakes metadata extractor threw ImageProcessingException when reading metadata." + " Returning default orientation for image."); } catch (IOException e) { LOGGER.warn("drewnoakes metadata extractor threw IOException when reading metadata." + " Returning default orientation for image."); } return imageTransform; } /** * Converts an orientation number to an ImageTransform object used by Lumify. * * @param orientationInt The EXIF orientation number, from 1 - 8, representing the combinations of 4 different * rotations and 2 different flipped values. * @return */ public static ImageTransform convertOrientationToTransform(int orientationInt) { switch (orientationInt) { case 1: return new ImageTransform(false, 0); case 2: return new ImageTransform(true, 0); case 3: return new ImageTransform(false, 180); case 4: return new ImageTransform(true, 180); case 5: return new ImageTransform(true, 270); case 6: return new ImageTransform(false, 90); case 7: return new ImageTransform(true, 90); case 8: return new ImageTransform(false, 270); default: return new ImageTransform(false, 0); } } }