package io.lumify.imageMetadataHelper;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifSubIFDDirectory;
import com.drew.metadata.jpeg.JpegDirectory;
import io.lumify.core.util.LumifyLogger;
import io.lumify.core.util.LumifyLoggerFactory;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class DimensionsExtractor {
private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(DimensionsExtractor.class);
private static enum Dimension {
WIDTH, HEIGHT
}
/**
* Checks the metadata directories in order until the width is found. The first match found in a directory
* is returned.
*
* @param metadata
* @return
*/
public static Integer getWidthViaMetadata(Metadata metadata) {
return getDimensionViaMetadata(metadata, Dimension.WIDTH);
}
/**
* Checks the metadata directories in order until the height is found. The first match found in a directory
* is returned.
*
* @param metadata
* @return
*/
public static Integer getHeightViaMetadata(Metadata metadata) {
return getDimensionViaMetadata(metadata, Dimension.HEIGHT);
}
private static Integer getDimensionViaMetadata(Metadata metadata, DimensionsExtractor.Dimension dimensionType) {
if (dimensionType == null ){
return null;
}
int exifDimensionTag;
int jpegDimensionTag;
if (dimensionType == Dimension.WIDTH){
exifDimensionTag = ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH;
jpegDimensionTag = JpegDirectory.TAG_JPEG_IMAGE_WIDTH;
}
else if (dimensionType == Dimension.HEIGHT){
exifDimensionTag = ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT;
jpegDimensionTag = JpegDirectory.TAG_JPEG_IMAGE_HEIGHT;
} else {
throw new IllegalArgumentException("dimensionType was not equal to 'HEIGHT' or 'WIDTH'.");
}
ExifSubIFDDirectory exifDir = metadata.getDirectory(ExifSubIFDDirectory.class);
if (exifDir != null) {
Integer dimension = exifDir.getInteger(exifDimensionTag);
if (dimension != null && !dimension.equals(0)) {
return dimension;
}
}
JpegDirectory jpegDir = metadata.getDirectory(JpegDirectory.class);
if (jpegDir != null) {
Integer dimension = jpegDir.getInteger(jpegDimensionTag);
if (dimension != null && !dimension.equals(0)) {
return dimension;
}
}
return null;
}
/**
* Get the width of the image file by loading the file as a buffered image.
* @return
*/
public static Integer getWidthViaBufferedImage(File imageFile){
try {
BufferedImage bufImage = ImageIO.read(imageFile);
int width = bufImage.getWidth();
return width;
} catch (IOException e){
if (imageFile != null) {
LOGGER.debug("Could not read imageFile: " + imageFile.getName());
}
}
return null;
}
/**
* Get the height of the image file by loading the file as a buffered image.
* @return
*/
public static Integer getHeightViaBufferedImage(File imageFile){
try {
BufferedImage bufImage = ImageIO.read(imageFile);
int height = bufImage.getHeight();
return height;
} catch (IOException e){
if (imageFile != null) {
LOGGER.debug("Could not read imageFile: " + imageFile.getName());
}
}
return null;
}
}