]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/jpeg/ExternalExifLibrary.java
Version 18, July 2015
[GpsPrune.git] / tim / prune / jpeg / ExternalExifLibrary.java
index 0d94f038479b829f3393ffc1fcbfc76fc795954c..4d06a2728ccfb42d41a83a2486bb98b35b5546ee 100644 (file)
@@ -2,12 +2,14 @@ package tim.prune.jpeg;
 
 import java.io.File;
 
+import com.drew.imaging.ImageMetadataReader;
 import com.drew.lang.Rational;
 import com.drew.metadata.Directory;
 import com.drew.metadata.Metadata;
-import com.drew.metadata.MetadataException;
-import com.drew.metadata.exif.ExifDirectory;
+import com.drew.metadata.exif.ExifSubIFDDirectory;
+import com.drew.metadata.exif.ExifIFD0Directory;
 import com.drew.metadata.exif.ExifReader;
+import com.drew.metadata.exif.ExifThumbnailDirectory;
 import com.drew.metadata.exif.GpsDirectory;
 
 /**
@@ -31,57 +33,52 @@ public class ExternalExifLibrary implements ExifLibrary
                // Read exif data from picture
                try
                {
-                       Metadata metadata = new Metadata();
-                       new ExifReader(inFile).extract(metadata);
+                       Metadata metadata = ImageMetadataReader.readMetadata(inFile);
                        if (metadata.containsDirectory(GpsDirectory.class))
                        {
                                Directory gpsdir = metadata.getDirectory(GpsDirectory.class);
-                               if (gpsdir.containsTag(GpsDirectory.TAG_GPS_LATITUDE)
-                                       && gpsdir.containsTag(GpsDirectory.TAG_GPS_LONGITUDE)
-                                       && gpsdir.containsTag(GpsDirectory.TAG_GPS_LATITUDE_REF)
-                                       && gpsdir.containsTag(GpsDirectory.TAG_GPS_LONGITUDE_REF))
+                               if (gpsdir.containsTag(GpsDirectory.TAG_LATITUDE)
+                                       && gpsdir.containsTag(GpsDirectory.TAG_LONGITUDE)
+                                       && gpsdir.containsTag(GpsDirectory.TAG_LATITUDE_REF)
+                                       && gpsdir.containsTag(GpsDirectory.TAG_LONGITUDE_REF))
                                {
-                                       data.setLatitudeRef(gpsdir.getString(GpsDirectory.TAG_GPS_LATITUDE_REF));
-                                       Rational[] latRats = gpsdir.getRationalArray(GpsDirectory.TAG_GPS_LATITUDE);
+                                       data.setLatitudeRef(gpsdir.getString(GpsDirectory.TAG_LATITUDE_REF));
+                                       Rational[] latRats = gpsdir.getRationalArray(GpsDirectory.TAG_LATITUDE);
                                        double seconds = ExifGateway.convertToPositiveValue(latRats[2].getNumerator(), latRats[2].getDenominator());
                                        data.setLatitude(new double[] {latRats[0].doubleValue(),
                                                latRats[1].doubleValue(), seconds});
-                                       data.setLongitudeRef(gpsdir.getString(GpsDirectory.TAG_GPS_LONGITUDE_REF));
-                                       Rational[] lonRats = gpsdir.getRationalArray(GpsDirectory.TAG_GPS_LONGITUDE);
+                                       data.setLongitudeRef(gpsdir.getString(GpsDirectory.TAG_LONGITUDE_REF));
+                                       Rational[] lonRats = gpsdir.getRationalArray(GpsDirectory.TAG_LONGITUDE);
                                        seconds = ExifGateway.convertToPositiveValue(lonRats[2].getNumerator(), lonRats[2].getDenominator());
                                        data.setLongitude(new double[] {lonRats[0].doubleValue(),
                                                lonRats[1].doubleValue(), seconds});
                                }
 
                                // Altitude (if present)
-                               if (gpsdir.containsTag(GpsDirectory.TAG_GPS_ALTITUDE) && gpsdir.containsTag(GpsDirectory.TAG_GPS_ALTITUDE_REF))
+                               if (gpsdir.containsTag(GpsDirectory.TAG_ALTITUDE) && gpsdir.containsTag(GpsDirectory.TAG_ALTITUDE_REF))
                                {
-                                       data.setAltitude(gpsdir.getRational(GpsDirectory.TAG_GPS_ALTITUDE).intValue());
-                                       byte altRef = (byte) gpsdir.getInt(GpsDirectory.TAG_GPS_ALTITUDE_REF);
+                                       data.setAltitude(gpsdir.getRational(GpsDirectory.TAG_ALTITUDE).intValue());
+                                       byte altRef = (byte) gpsdir.getInt(GpsDirectory.TAG_ALTITUDE_REF);
                                        data.setAltitudeRef(altRef);
                                }
 
-                               try
+                               // Timestamp and datestamp (if present)
+                               final int TAG_DATESTAMP = 0x001d;
+                               if (gpsdir.containsTag(GpsDirectory.TAG_TIME_STAMP) && gpsdir.containsTag(TAG_DATESTAMP))
                                {
-                                       // Timestamp and datestamp (if present)
-                                       final int TAG_GPS_DATESTAMP = 0x001d;
-                                       if (gpsdir.containsTag(GpsDirectory.TAG_GPS_TIME_STAMP) && gpsdir.containsTag(TAG_GPS_DATESTAMP))
-                                       {
-                                               Rational[] times = gpsdir.getRationalArray(GpsDirectory.TAG_GPS_TIME_STAMP);
-                                               data.setGpsTimestamp(new int[] {times[0].intValue(), times[1].intValue(),
-                                                       times[2].intValue()});
-                                               Rational[] dates = gpsdir.getRationalArray(TAG_GPS_DATESTAMP);
-                                               if (dates != null) {
-                                                       data.setGpsDatestamp(new int[] {dates[0].intValue(), dates[1].intValue(), dates[2].intValue()});
-                                               }
+                                       Rational[] times = gpsdir.getRationalArray(GpsDirectory.TAG_TIME_STAMP);
+                                       data.setGpsTimestamp(new int[] {times[0].intValue(), times[1].intValue(),
+                                               times[2].intValue()});
+                                       Rational[] dates = gpsdir.getRationalArray(TAG_DATESTAMP);
+                                       if (dates != null) {
+                                               data.setGpsDatestamp(new int[] {dates[0].intValue(), dates[1].intValue(), dates[2].intValue()});
                                        }
                                }
-                               catch (MetadataException me) {} // ignore, use other tags instead
 
                                // Image bearing (if present)
-                               if (gpsdir.containsTag(GpsDirectory.TAG_GPS_IMG_DIRECTION) && gpsdir.containsTag(GpsDirectory.TAG_GPS_IMG_DIRECTION_REF))
+                               if (gpsdir.containsTag(GpsDirectory.TAG_IMG_DIRECTION) && gpsdir.containsTag(GpsDirectory.TAG_IMG_DIRECTION_REF))
                                {
-                                       Rational bearing = gpsdir.getRational(GpsDirectory.TAG_GPS_IMG_DIRECTION);
+                                       Rational bearing = gpsdir.getRational(GpsDirectory.TAG_IMG_DIRECTION);
                                        if (bearing != null) {
                                                data.setBearing(bearing.doubleValue());
                                        }
@@ -89,30 +86,39 @@ public class ExternalExifLibrary implements ExifLibrary
                        }
 
                        // Tags from Exif directory
-                       if (metadata.containsDirectory(ExifDirectory.class))
+                       if (metadata.containsDirectory(ExifSubIFDDirectory.class))
                        {
-                               Directory exifdir = metadata.getDirectory(ExifDirectory.class);
+                               Directory exifdir = metadata.getDirectory(ExifSubIFDDirectory.class);
 
                                // Take time and date from exif tags
-                               if (exifdir.containsTag(ExifDirectory.TAG_DATETIME_ORIGINAL)) {
-                                       data.setOriginalTimestamp(exifdir.getString(ExifDirectory.TAG_DATETIME_ORIGINAL));
+                               if (exifdir.containsTag(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL)) {
+                                       data.setOriginalTimestamp(exifdir.getString(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL));
                                }
                                // Also take "digitized" timestamp
-                               if (exifdir.containsTag(ExifDirectory.TAG_DATETIME_DIGITIZED)) {
-                                       data.setDigitizedTimestamp(exifdir.getString(ExifDirectory.TAG_DATETIME_DIGITIZED));
+                               if (exifdir.containsTag(ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED)) {
+                                       data.setDigitizedTimestamp(exifdir.getString(ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED));
                                }
+                       }
+                       if (metadata.containsDirectory(ExifIFD0Directory.class))
+                       {
+                               Directory exifdir = metadata.getDirectory(ExifIFD0Directory.class);
 
                                // Photo rotation code
-                               if (exifdir.containsTag(ExifDirectory.TAG_ORIENTATION)) {
-                                       data.setOrientationCode(exifdir.getInt(ExifDirectory.TAG_ORIENTATION));
+                               if (exifdir.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+                                       data.setOrientationCode(exifdir.getInt(ExifIFD0Directory.TAG_ORIENTATION));
                                        // NOTE: this presumably takes the _last_ orientation value found, not the first.
                                }
+                       }
+
+                       if (metadata.containsDirectory(ExifThumbnailDirectory.class))
+                       {
+                               ExifThumbnailDirectory exifdir = metadata.getDirectory(ExifThumbnailDirectory.class);
 
-                               // Thumbnail
-                               if (exifdir.containsTag(ExifDirectory.TAG_THUMBNAIL_DATA))
+                               // TODO: Check this thumbnail stuff
+                               if (exifdir.hasThumbnailData())
                                {
-                                       // Make a copy of the byte data rather than keeping a reference to extracted array
-                                       byte[] tdata = exifdir.getByteArray(ExifDirectory.TAG_THUMBNAIL_DATA);
+                                       // Make a copy of the byte data
+                                       byte[] tdata = exifdir.getThumbnailData();
                                        byte[] thumb = new byte[tdata.length];
                                        System.arraycopy(tdata, 0, thumb, 0, tdata.length);
                                        data.setThumbnailImage(thumb);