001 // License: GPL. Copyright 2007 by Immanuel Scholz and others
002 package org.openstreetmap.josm.tools;
003
004 import java.io.File;
005 import java.text.ParseException;
006 import java.util.Date;
007 import java.util.Iterator;
008
009 import com.drew.imaging.jpeg.JpegMetadataReader;
010 import com.drew.imaging.jpeg.JpegProcessingException;
011 import com.drew.metadata.Directory;
012 import com.drew.metadata.Metadata;
013 import com.drew.metadata.MetadataException;
014 import com.drew.metadata.Tag;
015 import com.drew.metadata.exif.ExifDirectory;
016
017 /**
018 * Read out exif file information from a jpeg file
019 * @author Imi
020 */
021 public class ExifReader {
022
023 @SuppressWarnings("unchecked") public static Date readTime(File filename) throws ParseException {
024 try {
025 Metadata metadata = JpegMetadataReader.readMetadata(filename);
026 String dateStr = null;
027 OUTER:
028 for (Iterator<Directory> dirIt = metadata.getDirectoryIterator(); dirIt.hasNext();) {
029 for (Iterator<Tag> tagIt = dirIt.next().getTagIterator(); tagIt.hasNext();) {
030 Tag tag = tagIt.next();
031 if (tag.getTagType() == ExifDirectory.TAG_DATETIME_ORIGINAL /* 0x9003 */) {
032 dateStr = tag.getDescription();
033 break OUTER; // prefer this tag
034 }
035 if (tag.getTagType() == ExifDirectory.TAG_DATETIME /* 0x0132 */ ||
036 tag.getTagType() == ExifDirectory.TAG_DATETIME_DIGITIZED /* 0x9004 */) {
037 dateStr = tag.getDescription();
038 }
039 }
040 }
041 dateStr = dateStr.replace('/', ':'); // workaround for HTC Sensation bug, see #7228
042 return DateParser.parse(dateStr);
043 } catch (ParseException e) {
044 throw e;
045 } catch (Exception e) {
046 e.printStackTrace();
047 }
048 return null;
049 }
050
051 @SuppressWarnings("unchecked") public static Integer readOrientation(File filename) throws ParseException {
052 Integer orientation = null;
053 try {
054 final Metadata metadata = JpegMetadataReader.readMetadata(filename);
055 final Directory dir = metadata.getDirectory(ExifDirectory.class);
056 orientation = dir.getInt(ExifDirectory.TAG_ORIENTATION);
057 } catch (JpegProcessingException e) {
058 e.printStackTrace();
059 } catch (MetadataException e) {
060 e.printStackTrace();
061 }
062 return orientation;
063 }
064
065 }