]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/jpeg/drew/ExifReader.java
Version 13, August 2011
[GpsPrune.git] / tim / prune / jpeg / drew / ExifReader.java
index d4df892770e395569272099de5dcaa9279aba687..08f30128035a8c2f2b7a483ba3e69daeeacf30d9 100644 (file)
@@ -3,6 +3,7 @@ package tim.prune.jpeg.drew;
 import java.io.File;\r
 import java.util.HashMap;\r
 \r
+import tim.prune.jpeg.ExifGateway;\r
 import tim.prune.jpeg.JpegData;\r
 \r
 /**\r
@@ -84,6 +85,8 @@ public class ExifReader
        private static final int TAG_THUMBNAIL_LENGTH = 0x0202;\r
        /** Orientation of image */\r
        private static final int TAG_ORIENTATION = 0x0112;\r
+       /** Bearing direction of image */\r
+       private static final int TAG_BEARING = 0x0011;\r
 \r
 \r
        /**\r
@@ -93,8 +96,7 @@ public class ExifReader
         */\r
        public ExifReader(File inFile) throws JpegException\r
        {\r
-               JpegSegmentData segments = JpegSegmentReader.readSegments(inFile);\r
-               _data = segments.getSegment(JpegSegmentReader.SEGMENT_APP1);\r
+               _data = JpegSegmentReader.readExifSegment(inFile);\r
        }\r
 \r
        /**\r
@@ -343,14 +345,16 @@ public class ExifReader
                                        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
+                                       inMetadata.setLatitude(new double[] {latitudes[0].doubleValue(), latitudes[1].doubleValue(),\r
+                                               ExifGateway.convertToPositiveValue(latitudes[2].getNumerator(), latitudes[2].getDenominator())});\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
+                                       inMetadata.setLongitude(new double[] {longitudes[0].doubleValue(), longitudes[1].doubleValue(),\r
+                                               ExifGateway.convertToPositiveValue(longitudes[2].getNumerator(), longitudes[2].getDenominator())});\r
                                        break;\r
                                case TAG_GPS_ALTITUDE_REF:\r
                                        inMetadata.setAltitudeRef(_data[inTagValueOffset]);\r
@@ -367,7 +371,8 @@ public class ExifReader
                                        if (dates != null) {\r
                                                inMetadata.setGpsDatestamp(new int[] {dates[0].intValue(), dates[1].intValue(), dates[2].intValue()});\r
                                        }\r
-                                       else {\r
+                                       else\r
+                                       {\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
@@ -376,6 +381,12 @@ public class ExifReader
                                                }\r
                                        }\r
                                        break;\r
+                               case TAG_BEARING:\r
+                                       Rational val = readRational(inTagValueOffset, inFormatCode, inComponentCount);\r
+                                       if (val != null) {\r
+                                               inMetadata.setBearing(val.doubleValue());\r
+                                       }\r
+                                       break;\r
                                default: // ignore all other tags\r
                        }\r
                }\r