]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/jpeg/drew/ExifReader.java
Version 11, August 2010
[GpsPrune.git] / tim / prune / jpeg / drew / ExifReader.java
index 50a72d0caffd37c987f9897b9ec2ff2860a83994..d4df892770e395569272099de5dcaa9279aba687 100644 (file)
@@ -74,8 +74,10 @@ public class ExifReader
        public static final int TAG_GPS_TIMESTAMP = 0x0007;\r
        /** GPS date (atomic clock) GPSDateStamp 23 1d RATIONAL 3 */\r
        public static final int TAG_GPS_DATESTAMP = 0x001d;\r
-       /** Exif timestamp */\r
+       /** "Original" Exif timestamp */\r
        public static final int TAG_DATETIME_ORIGINAL = 0x9003;\r
+       /** "Creation" or "Digitized" timestamp */\r
+    public static final int TAG_DATETIME_DIGITIZED = 0x9004;\r
        /** Thumbnail offset */\r
        private static final int TAG_THUMBNAIL_OFFSET = 0x0201;\r
        /** Thumbnail length */\r
@@ -331,39 +333,53 @@ public class ExifReader
        private void processGpsTag(JpegData inMetadata, int inTagType, int inTagValueOffset,\r
                int inComponentCount, int inFormatCode)\r
        {\r
-               // Only interested in tags latref, lat, longref, lon, altref, alt and gps timestamp\r
-               switch (inTagType)\r
+               try\r
                {\r
-                       case TAG_GPS_LATITUDE_REF:\r
-                               inMetadata.setLatitudeRef(readString(inTagValueOffset, inFormatCode, inComponentCount));\r
-                               break;\r
-                       case TAG_GPS_LATITUDE:\r
-                               Rational[] latitudes = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
-                               inMetadata.setLatitude(new double[] {latitudes[0].doubleValue(), latitudes[1].doubleValue(), latitudes[2].doubleValue()});\r
-                               break;\r
-                       case TAG_GPS_LONGITUDE_REF:\r
-                               inMetadata.setLongitudeRef(readString(inTagValueOffset, inFormatCode, inComponentCount));\r
-                               break;\r
-                       case TAG_GPS_LONGITUDE:\r
-                               Rational[] longitudes = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
-                               inMetadata.setLongitude(new double[] {longitudes[0].doubleValue(), longitudes[1].doubleValue(), longitudes[2].doubleValue()});\r
-                               break;\r
-                       case TAG_GPS_ALTITUDE_REF:\r
-                               inMetadata.setAltitudeRef(_data[inTagValueOffset]);\r
-                               break;\r
-                       case TAG_GPS_ALTITUDE:\r
-                               inMetadata.setAltitude(readRational(inTagValueOffset, inFormatCode, inComponentCount).intValue());\r
-                               break;\r
-                       case TAG_GPS_TIMESTAMP:\r
-                               Rational[] times = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
-                               inMetadata.setGpsTimestamp(new int[] {times[0].intValue(), times[1].intValue(), times[2].intValue()});\r
-                               break;\r
-                       case TAG_GPS_DATESTAMP:\r
-                               Rational[] dates = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
-                               inMetadata.setGpsDatestamp(new int[] {dates[0].intValue(), dates[1].intValue(), dates[2].intValue()});\r
-                               break;\r
-                       default: // ignore all other tags\r
+                       // Only interested in tags latref, lat, longref, lon, altref, alt and gps timestamp\r
+                       switch (inTagType)\r
+                       {\r
+                               case TAG_GPS_LATITUDE_REF:\r
+                                       inMetadata.setLatitudeRef(readString(inTagValueOffset, inFormatCode, inComponentCount));\r
+                                       break;\r
+                               case TAG_GPS_LATITUDE:\r
+                                       Rational[] latitudes = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
+                                       inMetadata.setLatitude(new double[] {latitudes[0].doubleValue(), latitudes[1].doubleValue(), latitudes[2].doubleValue()});\r
+                                       break;\r
+                               case TAG_GPS_LONGITUDE_REF:\r
+                                       inMetadata.setLongitudeRef(readString(inTagValueOffset, inFormatCode, inComponentCount));\r
+                                       break;\r
+                               case TAG_GPS_LONGITUDE:\r
+                                       Rational[] longitudes = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
+                                       inMetadata.setLongitude(new double[] {longitudes[0].doubleValue(), longitudes[1].doubleValue(), longitudes[2].doubleValue()});\r
+                                       break;\r
+                               case TAG_GPS_ALTITUDE_REF:\r
+                                       inMetadata.setAltitudeRef(_data[inTagValueOffset]);\r
+                                       break;\r
+                               case TAG_GPS_ALTITUDE:\r
+                                       inMetadata.setAltitude(readRational(inTagValueOffset, inFormatCode, inComponentCount).intValue());\r
+                                       break;\r
+                               case TAG_GPS_TIMESTAMP:\r
+                                       Rational[] times = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
+                                       inMetadata.setGpsTimestamp(new int[] {times[0].intValue(), times[1].intValue(), times[2].intValue()});\r
+                                       break;\r
+                               case TAG_GPS_DATESTAMP:\r
+                                       Rational[] dates = readRationalArray(inTagValueOffset, inFormatCode, inComponentCount);\r
+                                       if (dates != null) {\r
+                                               inMetadata.setGpsDatestamp(new int[] {dates[0].intValue(), dates[1].intValue(), dates[2].intValue()});\r
+                                       }\r
+                                       else {\r
+                                               // Not in rational array format, but maybe as String?\r
+                                               String date = readString(inTagValueOffset, inFormatCode, inComponentCount);\r
+                                               if (date != null && date.length() == 10) {\r
+                                                       inMetadata.setGpsDatestamp(new int[] {Integer.parseInt(date.substring(0, 4)),\r
+                                                               Integer.parseInt(date.substring(5, 7)), Integer.parseInt(date.substring(8))});\r
+                                               }\r
+                                       }\r
+                                       break;\r
+                               default: // ignore all other tags\r
+                       }\r
                }\r
+               catch (Exception e) {} // ignore and continue\r
        }\r
 \r
 \r
@@ -379,10 +395,12 @@ public class ExifReader
                int inComponentCount, int inFormatCode)\r
        {\r
                // Only interested in original timestamp, thumbnail offset and thumbnail length\r
-               if (inTagType == TAG_DATETIME_ORIGINAL)\r
-               {\r
+               if (inTagType == TAG_DATETIME_ORIGINAL) {\r
                        inMetadata.setOriginalTimestamp(readString(inTagValueOffset, inFormatCode, inComponentCount));\r
                }\r
+               else if (inTagType == TAG_DATETIME_DIGITIZED) {\r
+                       inMetadata.setDigitizedTimestamp(readString(inTagValueOffset, inFormatCode, inComponentCount));\r
+               }\r
                else if (inTagType == TAG_THUMBNAIL_OFFSET) {\r
                        _thumbnailOffset = TIFF_HEADER_START_OFFSET + get16Bits(inTagValueOffset);\r
                        extractThumbnail(inMetadata);\r