diff options
Diffstat (limited to 'gallerycommon/src/com/android/gallery3d/exif/ExifData.java')
-rw-r--r-- | gallerycommon/src/com/android/gallery3d/exif/ExifData.java | 95 |
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 +} |