package org.hipi.image.io;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Metadata;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.HashMap;
/**
* Routines for extracting EXIF data contained in a JPEG or PNG image and for flattening this type
* of data to produce a single key/value dictionary.
*/
public class ExifDataReader {
private class UnclosableBufferedInputStream extends BufferedInputStream {
public UnclosableBufferedInputStream(InputStream in) {
super(in);
}
@Override
public void close() throws IOException {
}
}
private UnclosableBufferedInputStream ubis;
public ExifDataReader(InputStream is) {
ubis = new UnclosableBufferedInputStream(is);
}
public Metadata extract() throws ImageProcessingException, IOException {
return ImageMetadataReader.readMetadata(ubis);
}
public static HashMap<String,String> extractAndFlatten(InputStream is) throws IOException {
HashMap<String,String> exifData = new HashMap<String,String>();
try {
ExifDataReader reader = new ExifDataReader(is);
Metadata metadata = reader.extract();
Iterator directories = metadata.getDirectories().iterator();
while (directories.hasNext()) {
Directory directory = (Directory)directories.next();
Iterator tags = directory.getTags().iterator();
while (tags.hasNext()) {
Tag tag = (Tag)tags.next();
exifData.put(tag.getTagName(), tag.getDescription());
}
}
} catch (ImageProcessingException ex) {
throw new IOException(String.format("Encountered error while attempting to extract image EXIF data [%s]", ex.getMessage()));
}
return exifData;
}
}