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
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
*/\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
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
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
}\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