summaryrefslogtreecommitdiffstats
path: root/gallerycommon/src/com/android/gallery3d/exif/ExifData.java
diff options
context:
space:
mode:
Diffstat (limited to 'gallerycommon/src/com/android/gallery3d/exif/ExifData.java')
-rw-r--r--gallerycommon/src/com/android/gallery3d/exif/ExifData.java95
1 files changed, 80 insertions, 15 deletions
diff --git a/gallerycommon/src/com/android/gallery3d/exif/ExifData.java b/gallerycommon/src/com/android/gallery3d/exif/ExifData.java
index 39eb57455..6e5c227d5 100644
--- a/gallerycommon/src/com/android/gallery3d/exif/ExifData.java
+++ b/gallerycommon/src/com/android/gallery3d/exif/ExifData.java
@@ -17,8 +17,12 @@
package com.android.gallery3d.exif;
import java.nio.ByteOrder;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Calendar;
+import java.util.TimeZone;
/**
* This class stores the EXIF header in IFDs according to the JPEG specification.
@@ -27,6 +31,17 @@ import java.util.Arrays;
* @see IfdData
*/
public class ExifData {
+
+ private static final String GPS_DATE_FORMAT_STR = "yyyy:MM:dd";
+ private static final String DATETIME_FORMAT_STR = "yyyy:MM:dd kk:mm:ss";
+
+ private final DateFormat mDateTimeStampFormat =
+ new SimpleDateFormat(DATETIME_FORMAT_STR);
+ private final DateFormat mGPSDateStampFormat =
+ new SimpleDateFormat(GPS_DATE_FORMAT_STR);
+ private final Calendar mGPSTimeStampCalendar = Calendar.getInstance(
+ TimeZone.getTimeZone("UTC"));
+
private final IfdData[] mIfdDatas = new IfdData[IfdId.TYPE_IFD_COUNT];
private byte[] mThumbnail;
private ArrayList<byte[]> mStripBytes = new ArrayList<byte[]>();
@@ -34,6 +49,7 @@ public class ExifData {
public ExifData(ByteOrder order) {
mByteOrder = order;
+ mGPSDateStampFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
IfdData getIfdData(int ifdId) {
@@ -127,7 +143,9 @@ public class ExifData {
}
for (int i = 0; i < IfdId.TYPE_IFD_COUNT; i++) {
- if (!Util.equals(data.getIfdData(i), getIfdData(i))) return false;
+ IfdData ifd1 = data.getIfdData(i);
+ IfdData ifd2 = getIfdData(i);
+ if ((ifd1 != ifd2) && (ifd1 != null && !ifd1.equals(ifd2))) return false;
}
return true;
}
@@ -135,8 +153,9 @@ public class ExifData {
}
/**
- * Adds {@link ExifTag#TAG_GPS_LATITUDE}, {@link ExifTag#TAG_GPS_LONGITUDE},
- * {@link ExifTag#TAG_GPS_LATITUDE_REF} and {@link ExifTag#TAG_GPS_LONGITUDE_REF} with the
+ * A convenient method to adds tags {@link ExifTag#TAG_GPS_LATITUDE},
+ * {@link ExifTag#TAG_GPS_LONGITUDE}, {@link ExifTag#TAG_GPS_LATITUDE_REF} and
+ * {@link ExifTag#TAG_GPS_LONGITUDE_REF} at once with the
* given latitude and longitude.
*/
public void addGpsTags(double latitude, double longitude) {
@@ -167,6 +186,40 @@ public class ExifData {
gpsIfd.setTag(longRefTag);
}
+ /**
+ * A convenient method to add date or time related tags (
+ * {@link ExifTag#TAG_DATE_TIME_DIGITIZED}, {@link ExifTag#TAG_DATE_TIME_ORIGINAL},
+ * and {@link ExifTag#TAG_DATE_TIME}) with the given time stamp value.
+ *
+ */
+ public void addDateTimeStampTag(short tagId, long timestamp, TimeZone timezone) {
+ if (tagId == ExifTag.TAG_DATE_TIME ||
+ tagId == ExifTag.TAG_DATE_TIME_DIGITIZED ||
+ tagId == ExifTag.TAG_DATE_TIME_ORIGINAL) {
+ mDateTimeStampFormat.setTimeZone(timezone);
+ addTag(tagId).setValue(mDateTimeStampFormat.format(timestamp));
+ } else {
+ throw new IllegalArgumentException(
+ String.format("Tag %04x is not a supported date or time stamp tag", tagId));
+ }
+ }
+
+ /**
+ * A convenient method to add both {@link ExifTag#TAG_GPS_DATE_STAMP}
+ * and {@link ExifTag#TAG_GPS_TIME_STAMP}).
+ * Note that UTC timezone will be used as specified in the EXIF standard.
+ */
+ public void addGpsDateTimeStampTag(long timestamp) {
+ addTag(ExifTag.TAG_GPS_DATE_STAMP).setValue(mGPSDateStampFormat.format(timestamp));
+
+ mGPSTimeStampCalendar.setTimeInMillis(timestamp);
+ addTag(ExifTag.TAG_GPS_TIME_STAMP).
+ setValue(new Rational[] {
+ new Rational(mGPSTimeStampCalendar.get(Calendar.HOUR_OF_DAY), 1),
+ new Rational(mGPSTimeStampCalendar.get(Calendar.MINUTE), 1),
+ new Rational(mGPSTimeStampCalendar.get(Calendar.SECOND), 1)});
+ }
+
private static Rational[] toExifLatLong(double value) {
// convert to the format dd/1 mm/1 ssss/100
value = Math.abs(value);
@@ -216,7 +269,8 @@ public class ExifData {
}
/**
- * Adds a tag with the given tag ID. The original tag will be replaced by the new tag. For tags
+ * Adds a tag with the given tag ID. If the tag of the given ID already exists,
+ * the original tag will be returned. Otherwise, a new ExifTag will be created. For tags
* related to interoperability or thumbnail, call {@link #addInteroperabilityTag(short)} or
* {@link #addThumbnailTag(short)} respectively.
* @exception IllegalArgumentException if the tag ID is invalid.
@@ -224,32 +278,43 @@ public class ExifData {
public ExifTag addTag(short tagId) {
int ifdId = ExifTag.getIfdIdFromTagId(tagId);
IfdData ifdData = getOrCreateIfdData(ifdId);
- ExifTag tag = ExifTag.buildTag(tagId);
- ifdData.setTag(tag);
+ ExifTag tag = ifdData.getTag(tagId);
+ if (tag == null) {
+ tag = ExifTag.buildTag(tagId);
+ ifdData.setTag(tag);
+ }
return tag;
}
/**
- * Adds a thumbnail-related tag with the given tag ID. The original tag will be replaced
- * by the new tag.
+ * Adds a thumbnail-related tag with the given tag ID. If the tag of the given ID
+ * already exists, the original tag will be returned. Otherwise, a new ExifTag will
+ * be created.
* @exception IllegalArgumentException if the tag ID is invalid.
*/
public ExifTag addThumbnailTag(short tagId) {
IfdData ifdData = getOrCreateIfdData(IfdId.TYPE_IFD_1);
- ExifTag tag = ExifTag.buildThumbnailTag(tagId);
- ifdData.setTag(tag);
+ ExifTag tag = ifdData.getTag(tagId);
+ if (tag == null) {
+ tag = ExifTag.buildThumbnailTag(tagId);
+ ifdData.setTag(tag);
+ }
return tag;
}
/**
- * Adds an interoperability-related tag with the given tag ID. The original tag will be
- * replaced by the new tag.
+ * Adds an interoperability-related tag with the given tag ID. If the tag of the given ID
+ * already exists, the original tag will be returned. Otherwise, a new ExifTag will
+ * be created.
* @exception IllegalArgumentException if the tag ID is invalid.
*/
public ExifTag addInteroperabilityTag(short tagId) {
IfdData ifdData = getOrCreateIfdData(IfdId.TYPE_IFD_INTEROPERABILITY);
- ExifTag tag = ExifTag.buildInteroperabilityTag(tagId);
- ifdData.setTag(tag);
+ ExifTag tag = ifdData.getTag(tagId);
+ if (tag == null) {
+ tag = ExifTag.buildInteroperabilityTag(tagId);
+ ifdData.setTag(tag);
+ }
return tag;
}
@@ -258,4 +323,4 @@ public class ExifData {
mStripBytes.clear();
mIfdDatas[IfdId.TYPE_IFD_1] = null;
}
-} \ No newline at end of file
+}