You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sanselan-commits@incubator.apache.org by cm...@apache.org on 2008/02/01 05:03:18 UTC

svn commit: r617350 - in /incubator/sanselan/trunk/src: main/java/org/apache/sanselan/common/ main/java/org/apache/sanselan/common/byteSources/ main/java/org/apache/sanselan/formats/tiff/ main/java/org/apache/sanselan/formats/tiff/constants/ main/java/...

Author: cmchen
Date: Thu Jan 31 21:03:16 2008
New Revision: 617350

URL: http://svn.apache.org/viewvc?rev=617350&view=rev
Log:
minor refinements to exif gps info and more convenience methods for writing exif info.

Modified:
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/byteSources/ByteSourceArray.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffDirectory.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/MetadataExample.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/WriteExifMetadataExample.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifBaseTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifDumpTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifRewriteTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/GpsTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/SpecificExifTagTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/WriteExifMetadataExampleTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/tiff/TiffReadTest.java

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java Thu Jan 31 21:03:16 2008
@@ -576,8 +576,8 @@
 	{
 		if (a.length != b.length)
 		{
-//			System.out.println("length mismatch: " + a.length + " != "
-//					+ b.length);
+			//			System.out.println("length mismatch: " + a.length + " != "
+			//					+ b.length);
 			return false;
 		}
 
@@ -598,8 +598,8 @@
 		{
 			if (a[aStart + i] != b[bStart + i])
 			{
-//				debugNumber("\t" + "a[" + (aStart + i) + "]", a[aStart + i]);
-//				debugNumber("\t" + "b[" + (bStart + i) + "]", b[bStart + i]);
+				//				debugNumber("\t" + "a[" + (aStart + i) + "]", a[aStart + i]);
+				//				debugNumber("\t" + "b[" + (bStart + i) + "]", b[bStart + i]);
 
 				return false;
 			}

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/byteSources/ByteSourceArray.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/byteSources/ByteSourceArray.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/byteSources/ByteSourceArray.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/byteSources/ByteSourceArray.java Thu Jan 31 21:03:16 2008
@@ -53,7 +53,7 @@
 		return result;
 	}
 
-		public long getLength()
+	public long getLength()
 	{
 		return bytes.length;
 	}

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffDirectory.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffDirectory.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffDirectory.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffDirectory.java Thu Jan 31 21:03:16 2008
@@ -35,7 +35,7 @@
 		return TiffDirectory.description(type);
 	}
 
-	public String getElementDescription(boolean verbose) 
+	public String getElementDescription(boolean verbose)
 	{
 		if (!verbose)
 			return "TIFF Directory (" + description() + ")";
@@ -188,8 +188,6 @@
 
 		return null;
 	}
-	
-
 
 	public final class ImageDataElement extends TiffElement
 	{

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java Thu Jan 31 21:03:16 2008
@@ -65,8 +65,7 @@
 	}
 
 	private int sortHint = -1;
-	
-	
+
 	public boolean isLocalValue()
 	{
 		return fieldType.isLocalValue(this);
@@ -281,8 +280,8 @@
 
 		if (null == possibleMatches)
 		{
-//			if (tag == 0x8769)
-//				Debug.debug("exif offset field is unknown.1");
+			//			if (tag == 0x8769)
+			//				Debug.debug("exif offset field is unknown.1");
 			return TIFF_TAG_UNKNOWN;
 		}
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java Thu Jan 31 21:03:16 2008
@@ -32,6 +32,7 @@
 import org.apache.sanselan.formats.tiff.write.TiffOutputDirectory;
 import org.apache.sanselan.formats.tiff.write.TiffOutputField;
 import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
+import org.apache.sanselan.util.Debug;
 
 public class TiffImageMetadata extends ImageMetadata
 		implements
@@ -360,6 +361,37 @@
 
 			return result.toString();
 		}
+
+		public double getLongitudeAsDegreesEast() throws ImageReadException
+		{
+			double result = longitudeDegrees.doubleValue()
+					+ (longitudeMinutes.doubleValue() / 60.0)
+					+ (longitudeSeconds.doubleValue() / 360.0);
+
+			if (longitudeRef.trim().equalsIgnoreCase("e"))
+				return result;
+			else if (longitudeRef.trim().equalsIgnoreCase("w"))
+				return -result;
+			else
+				throw new ImageReadException("Unknown longitude ref: \""
+						+ longitudeRef + "\"");
+		}
+
+		public double getLatitudeAsDegreesNorth() throws ImageReadException
+		{
+			double result = latitudeDegrees.doubleValue()
+					+ (latitudeMinutes.doubleValue() / 60.0)
+					+ (latitudeSeconds.doubleValue() / 360.0);
+
+			if (latitudeRef.trim().equalsIgnoreCase("n"))
+				return result;
+			else if (latitudeRef.trim().equalsIgnoreCase("s"))
+				return -result;
+			else
+				throw new ImageReadException("Unknown latitude ref: \""
+						+ latitudeRef + "\"");
+		}
+
 	}
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java Thu Jan 31 21:03:16 2008
@@ -129,6 +129,7 @@
 		{
 			super(name, tag, dataTypes, length, exifDirectory);
 		}
+
 		public Offset(String name, int tag, FieldType dataType, int length,
 				ExifDirectoryType exifDirectory)
 		{
@@ -412,14 +413,14 @@
 		public byte[] encodeValue(FieldType fieldType, Object value,
 				int byteOrder) throws ImageWriteException
 		{
-//			Debug.debug();
-//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag) + ") ",
-//					this);
-//			Debug.debug("unknown tag fieldType", fieldType);
-//			Debug.debug("unknown tag value", value);
-//			Debug.debug("unknown tag value", Debug.getType(value));
+			//			Debug.debug();
+			//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag) + ") ",
+			//					this);
+			//			Debug.debug("unknown tag fieldType", fieldType);
+			//			Debug.debug("unknown tag value", value);
+			//			Debug.debug("unknown tag value", Debug.getType(value));
 			byte result[] = super.encodeValue(fieldType, value, byteOrder);
-//			Debug.debug("unknown tag result", result);
+			//			Debug.debug("unknown tag result", result);
 			return result;
 		}
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java Thu Jan 31 21:03:16 2008
@@ -59,9 +59,8 @@
 			separateValueItem = new TiffOutputItem.Value(name, bytes);
 		}
 	}
-	
+
 	private int sortHint = -1;
-	
 
 	public static TiffOutputField create(TagInfo tagInfo, int byteOrder,
 			Number number) throws ImageWriteException
@@ -78,6 +77,38 @@
 		return new TiffOutputField(tagInfo.tag, tagInfo, fieldType, 1, bytes);
 	}
 
+
+	public static TiffOutputField create(TagInfo tagInfo, int byteOrder,
+			Number value[]) throws ImageWriteException
+	{
+		if (tagInfo.dataTypes == null || tagInfo.dataTypes.length < 1)
+			throw new ImageWriteException("Tag has no default data type.");
+		FieldType fieldType = tagInfo.dataTypes[0];
+
+		if (tagInfo.length != value.length)
+			throw new ImageWriteException("Tag does not expect a single value.");
+
+		byte bytes[] = fieldType.writeData(value, byteOrder);
+
+		return new TiffOutputField(tagInfo.tag, tagInfo, fieldType, value.length, bytes);
+	}
+
+	public static TiffOutputField create(TagInfo tagInfo, int byteOrder,
+			String value) throws ImageWriteException
+	{
+		FieldType fieldType;
+		if (tagInfo.dataTypes == null)
+			fieldType = FIELD_TYPE_ASCII;
+		else if (tagInfo.dataTypes == FIELD_TYPE_DESCRIPTION_ASCII)
+			fieldType = FIELD_TYPE_ASCII;
+		else
+			throw new ImageWriteException("Tag has unexpected data type.");
+
+		byte bytes[] = fieldType.writeData(value, byteOrder);
+
+		return new TiffOutputField(tagInfo.tag, tagInfo, fieldType, 1, bytes);
+	}
+
 	protected static final TiffOutputField createOffsetField(TagInfo tagInfo,
 			int byteOrder) throws ImageWriteException
 	{
@@ -90,19 +121,19 @@
 	protected void writeField(BinaryOutputStream bos) throws IOException,
 			ImageWriteException
 	{
-//		CachingOutputStream cos = null;
-//		if (tagInfo.isUnknown())
-//		{
-//			cos = new CachingOutputStream(bos);
-//			int byteOrder = bos.getByteOrder();
-//			bos = new BinaryOutputStream(cos, byteOrder);
-//			
-//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
-//					+ ") isLocalValue()", isLocalValue());
-//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
-//					+ ") bytes", bytes);
-//		}
-		
+		//		CachingOutputStream cos = null;
+		//		if (tagInfo.isUnknown())
+		//		{
+		//			cos = new CachingOutputStream(bos);
+		//			int byteOrder = bos.getByteOrder();
+		//			bos = new BinaryOutputStream(cos, byteOrder);
+		//			
+		//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+		//					+ ") isLocalValue()", isLocalValue());
+		//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+		//					+ ") bytes", bytes);
+		//		}
+
 		bos.write2Bytes(tag);
 		bos.write2Bytes(fieldType.type);
 		bos.write4Bytes(count);
@@ -128,11 +159,11 @@
 			if ((written % 2) != 0)
 				written++;
 		}
-//		if (null != cos)
-//		{
-//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
-//					+ ") written field", cos.getCache());
-//		}
+		//		if (null != cos)
+		//		{
+		//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+		//					+ ") written field", cos.getCache());
+		//		}
 	}
 
 	protected TiffOutputItem getSeperateValue()
@@ -147,10 +178,10 @@
 
 	protected void setData(byte bytes[]) throws ImageWriteException
 	{
-//		if(tagInfo.isUnknown())
-//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
-//					+ ") setData", bytes);
-			
+		//		if(tagInfo.isUnknown())
+		//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+		//					+ ") setData", bytes);
+
 		if (this.bytes.length != bytes.length)
 			throw new ImageWriteException("Cannot change size of value.");
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java Thu Jan 31 21:03:16 2008
@@ -20,6 +20,8 @@
 import java.util.List;
 
 import org.apache.sanselan.ImageWriteException;
+import org.apache.sanselan.common.RationalNumber;
+import org.apache.sanselan.formats.tiff.TiffField;
 import org.apache.sanselan.formats.tiff.constants.TagInfo;
 import org.apache.sanselan.formats.tiff.constants.TiffConstants;
 import org.apache.sanselan.util.Debug;
@@ -84,6 +86,15 @@
 		return addExifDirectory();
 	}
 
+	public TiffOutputDirectory getOrCreateGPSDirectory()
+			throws ImageWriteException
+	{
+		TiffOutputDirectory result = findDirectory(DIRECTORY_TYPE_GPS);
+		if (null != result)
+			return result;
+		return addGPSDirectory();
+	}
+
 	public TiffOutputDirectory getGPSDirectory()
 	{
 		return findDirectory(DIRECTORY_TYPE_GPS);
@@ -104,6 +115,79 @@
 				return directory;
 		}
 		return null;
+	}
+
+	/*
+	 * Expects longitude in degrees E, latitude in degrees N
+	 */
+	public void setGPSInDegrees(double longitude, double latitude)
+			throws ImageWriteException
+	{
+		TiffOutputDirectory gpsDirectory = getOrCreateGPSDirectory();
+
+		String longitudeRef = longitude < 0 ? "W" : "E";
+		longitude = Math.abs(longitude);
+		String latitudeRef = latitude < 0 ? "S" : "N";
+		latitude = Math.abs(latitude);
+
+		{
+			TiffOutputField longitudeRefField = TiffOutputField.create(
+					TiffConstants.GPS_TAG_GPS_LONGITUDE_REF, byteOrder,
+					longitudeRef);
+			gpsDirectory.removeField(TiffConstants.GPS_TAG_GPS_LONGITUDE_REF);
+			gpsDirectory.add(longitudeRefField);
+		}
+
+		{
+			TiffOutputField latitudeRefField = TiffOutputField.create(
+					TiffConstants.GPS_TAG_GPS_LATITUDE_REF, byteOrder,
+					latitudeRef);
+			gpsDirectory.removeField(TiffConstants.GPS_TAG_GPS_LATITUDE_REF);
+			gpsDirectory.add(latitudeRefField);
+		}
+
+		{
+			double value = longitude;
+			double longitudeDegrees = (long) value;
+			value %= 1;
+			value *= 60.0;
+			double longitudeMinutes = (long) value;
+			value %= 1;
+			value *= 60.0;
+			double longitudeSeconds = value;
+			Double values[] = {
+					new Double(longitudeDegrees), new Double(longitudeMinutes),
+					new Double(longitudeSeconds),
+			};
+
+			TiffOutputField longitudeField = TiffOutputField.create(
+					TiffConstants.GPS_TAG_GPS_LONGITUDE, byteOrder, values);
+			gpsDirectory.removeField(TiffConstants.GPS_TAG_GPS_LONGITUDE);
+			gpsDirectory.add(longitudeField);
+		}
+
+		{
+			double value = latitude;
+			double latitudeDegrees = (long) value;
+			value %= 1;
+			value *= 60.0;
+			double latitudeMinutes = (long) value;
+			value %= 1;
+			value *= 60.0;
+			double latitudeSeconds = value;
+			Double values[] = {
+					new Double(latitudeDegrees), new Double(latitudeMinutes),
+					new Double(latitudeSeconds),
+			};
+
+
+			
+			TiffOutputField latitudeField = TiffOutputField.create(
+					TiffConstants.GPS_TAG_GPS_LATITUDE, byteOrder, values);
+			gpsDirectory.removeField(TiffConstants.GPS_TAG_GPS_LATITUDE);
+			gpsDirectory.add(latitudeField);
+		}
+
 	}
 
 	public void removeField(TagInfo tagInfo)

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/MetadataExample.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/MetadataExample.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/MetadataExample.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/MetadataExample.java Thu Jan 31 21:03:16 2008
@@ -26,8 +26,10 @@
 import org.apache.sanselan.common.RationalNumber;
 import org.apache.sanselan.formats.jpeg.JpegImageMetadata;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.formats.tiff.TiffImageMetadata;
 import org.apache.sanselan.formats.tiff.constants.TagInfo;
 import org.apache.sanselan.formats.tiff.constants.TiffConstants;
+import org.apache.sanselan.util.Debug;
 
 public class MetadataExample
 {
@@ -71,7 +73,24 @@
 
 			System.out.println();
 
-			// more specific example of how to access GPS values.
+			// simple interface to GPS data
+			TiffImageMetadata exifMetadata = jpegMetadata.getExif();
+			if (null != exifMetadata)
+			{
+				TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS();
+				if (null != gpsInfo)
+				{
+					String gpsDescription = gpsInfo.toString();
+					double longitude = gpsInfo.getLongitudeAsDegreesEast();
+					double latitude = gpsInfo.getLatitudeAsDegreesNorth();
+
+					System.out.println("	" + "GPS Description: " + gpsInfo);
+					System.out.println("	" + "GPS Longitude (Degrees East): " + longitude);
+					System.out.println("	" + "GPS Latitude (Degrees North): " + latitude);
+				}
+			}
+
+			// more specific example of how to manually access GPS values
 			TiffField gpsLatitudeRefField = jpegMetadata
 					.findEXIFValue(TiffConstants.GPS_TAG_GPS_LATITUDE_REF);
 			TiffField gpsLatitudeField = jpegMetadata

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/WriteExifMetadataExample.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/WriteExifMetadataExample.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/WriteExifMetadataExample.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/sampleUsage/WriteExifMetadataExample.java Thu Jan 31 21:03:16 2008
@@ -125,6 +125,16 @@
 						.getOrCreateExifDirectory();
 				exifDirectory.add(aperture);
 			}
+			
+			{
+				// Example of how to add/update GPS info to output set.
+
+				// New York City
+				double longitude = -74.0; // 74 degrees W (in Degrees East)
+				double latitude = 40 + 43/60.0; // 40 degrees N (in Degrees North)
+
+				outputSet.setGPSInDegrees(longitude, latitude);
+			}
 
 			//			printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_DATE_TIME);
 
@@ -148,116 +158,5 @@
 		}
 	}
 
-	public static void metadataExample(File file) throws ImageReadException,
-			IOException
-	{
-		//        get all metadata stored in EXIF format (ie. from JPEG or TIFF).
-		//            org.w3c.dom.Node node = Sanselan.getMetadataObsolete(imageBytes);
-		IImageMetadata metadata = Sanselan.getMetadata(file);
-
-		//System.out.println(metadata);
-
-		if (metadata instanceof JpegImageMetadata)
-		{
-			JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
-
-			// Jpeg EXIF metadata is stored in a TIFF-based directory structure
-			// and is identified with TIFF tags.
-			// Here we look for the "x resolution" tag, but
-			// we could just as easily search for any other tag.
-			//
-			// see the TiffConstants file for a list of TIFF tags.
-
-			System.out.println("file: " + file.getPath());
-
-			// print out various interesting EXIF tags.
-			printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_XRESOLUTION);
-			printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_DATE_TIME);
-			printTagValue(jpegMetadata,
-					TiffConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
-			printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_CREATE_DATE);
-			printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_ISO);
-			printTagValue(jpegMetadata,
-					TiffConstants.EXIF_TAG_SHUTTER_SPEED_VALUE);
-			printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_APERTURE_VALUE);
-			printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_BRIGHTNESS_VALUE);
-			printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LATITUDE_REF);
-			printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LATITUDE);
-			printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LONGITUDE_REF);
-			printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LONGITUDE);
-
-			System.out.println();
-
-			// more specific example of how to access GPS values.
-			TiffField gpsLatitudeRefField = jpegMetadata
-					.findEXIFValue(TiffConstants.GPS_TAG_GPS_LATITUDE_REF);
-			TiffField gpsLatitudeField = jpegMetadata
-					.findEXIFValue(TiffConstants.GPS_TAG_GPS_LATITUDE);
-			TiffField gpsLongitudeRefField = jpegMetadata
-					.findEXIFValue(TiffConstants.GPS_TAG_GPS_LONGITUDE_REF);
-			TiffField gpsLongitudeField = jpegMetadata
-					.findEXIFValue(TiffConstants.GPS_TAG_GPS_LONGITUDE);
-			if (gpsLatitudeRefField != null && gpsLatitudeField != null
-					&& gpsLongitudeRefField != null
-					&& gpsLongitudeField != null)
-			{
-				// all of these values are strings.
-				String gpsLatitudeRef = (String) gpsLatitudeRefField.getValue();
-				RationalNumber gpsLatitude[] = (RationalNumber[]) (gpsLatitudeField
-						.getValue());
-				String gpsLongitudeRef = (String) gpsLongitudeRefField
-						.getValue();
-				RationalNumber gpsLongitude[] = (RationalNumber[]) gpsLongitudeField
-						.getValue();
-
-				RationalNumber gpsLatitudeDegrees = gpsLatitude[0];
-				RationalNumber gpsLatitudeMinutes = gpsLatitude[1];
-				RationalNumber gpsLatitudeSeconds = gpsLatitude[2];
-
-				RationalNumber gpsLongitudeDegrees = gpsLongitude[0];
-				RationalNumber gpsLongitudeMinutes = gpsLongitude[1];
-				RationalNumber gpsLongitudeSeconds = gpsLongitude[2];
-
-				// This will format the gps info like so:
-				//
-				// gpsLatitude: 8 degrees, 40 minutes, 42.2 seconds S
-				// gpsLongitude: 115 degrees, 26 minutes, 21.8 seconds E
-
-				System.out.println("	" + "GPS Latitude: "
-						+ gpsLatitudeDegrees.toDisplayString() + " degrees, "
-						+ gpsLatitudeMinutes.toDisplayString() + " minutes, "
-						+ gpsLatitudeSeconds.toDisplayString() + " seconds "
-						+ gpsLatitudeRef);
-				System.out.println("	" + "GPS Longitude: "
-						+ gpsLongitudeDegrees.toDisplayString() + " degrees, "
-						+ gpsLongitudeMinutes.toDisplayString() + " minutes, "
-						+ gpsLongitudeSeconds.toDisplayString() + " seconds "
-						+ gpsLongitudeRef);
-
-			}
-
-			System.out.println();
-
-			ArrayList items = jpegMetadata.getItems();
-			for (int i = 0; i < items.size(); i++)
-			{
-				Object item = items.get(i);
-				System.out.println("	" + "item: " + item);
-			}
-
-			System.out.println();
-		}
-	}
-
-	private static void printTagValue(JpegImageMetadata jpegMetadata,
-			TagInfo tagInfo) throws ImageReadException, IOException
-	{
-		TiffField field = jpegMetadata.findEXIFValue(tagInfo);
-		if (field == null)
-			System.out.println(tagInfo.name + ": " + "Not Found.");
-		else
-			System.out.println(tagInfo.name + ": "
-					+ field.getValueDescription());
-	}
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java Thu Jan 31 21:03:16 2008
@@ -889,7 +889,6 @@
 		}
 	}
 
-
 	public static final void purgeMemory()
 	{
 		try

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java Thu Jan 31 21:03:16 2008
@@ -76,10 +76,10 @@
 		File dataFolder = new File(testFolder, "data");
 		File imagesFolder = new File(dataFolder, "images");
 
-//				imagesFolder = new File(
+		//				imagesFolder = new File(
 		//		"src\\test\\data\\images\\exif\\drewNoakes\\");
 		//	"src\\test\\data\\images\\exif\\drewNoakes\\007_Canon EOS 20D (1).jpg");
-//"src\\test\\data\\images\\tiff\\");
+		//"src\\test\\data\\images\\tiff\\");
 
 		assertTrue(imagesFolder.exists());
 
@@ -138,17 +138,20 @@
 		if (filter != null)
 		{
 			List filtered = new ArrayList();
+//			long last = System.currentTimeMillis();
 			for (int i = 0; i < images.size(); i++)
 			{
-						Debug.purgeMemory();
-			
+				if(i%10==0)
+				Debug.purgeMemory();
+
 				File file = (File) images.get(i);
+//				Debug.debug("considering file", file.getAbsoluteFile());
 
 				if (file.getParentFile().getName().toLowerCase().equals(
 						"@broken"))
 					continue;
 
-				if (filter.accept(file))
+				if (filter.accept(file) )
 				{
 					filtered.add(file);
 					if (max > 0 && filtered.size() >= max)

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java Thu Jan 31 21:03:16 2008
@@ -60,8 +60,9 @@
 		List imageFiles = getTestImages();
 		for (int i = 0; i < imageFiles.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
-			
+
 			File imageFile = (File) imageFiles.get(i);
 			Debug.debug("imageFile", imageFile);
 			assertTrue(imageFile != null);

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java Thu Jan 31 21:03:16 2008
@@ -39,6 +39,7 @@
 		List images = getJpegImages();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifBaseTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifBaseTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifBaseTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifBaseTest.java Thu Jan 31 21:03:16 2008
@@ -43,9 +43,9 @@
 
 		if (!file.getName().toLowerCase().endsWith(".jpg"))
 			return false;
-		ImageFormat format = Sanselan.guessFormat(file);
-		if (format != ImageFormat.IMAGE_FORMAT_JPEG)
-			return false;
+//		ImageFormat format = Sanselan.guessFormat(file);
+//		if (format != ImageFormat.IMAGE_FORMAT_JPEG)
+//			return false;
 
 		//		Debug.debug("possible file", file);
 
@@ -76,12 +76,16 @@
 		return getTestImage(imageFilter);
 	}
 
-	//	, int max
-	//	
 	protected List getImagesWithExifData() throws IOException,
 			ImageReadException
 	{
 		return getTestImages(imageFilter);
+	}
+
+	protected List getImagesWithExifData(int max) throws IOException,
+			ImageReadException
+	{
+		return getTestImages(imageFilter, max);
 	}
 
 }

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifDumpTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifDumpTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifDumpTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifDumpTest.java Thu Jan 31 21:03:16 2008
@@ -34,10 +34,10 @@
 
 public class ExifDumpTest extends ExifBaseTest
 {
-//	public ExifDumpTest(String name)
-//	{
-//		super(name);
-//	}
+	//	public ExifDumpTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	public void test() throws IOException, ImageReadException,
 			ImageWriteException
@@ -45,6 +45,7 @@
 		List images = getImagesWithExifData();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);
@@ -57,13 +58,15 @@
 
 			Map params = new HashMap();
 			boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
-			params.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(!ignoreImageData));
+			params
+					.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
+							!ignoreImageData));
 
 			JpegImageMetadata metadata = (JpegImageMetadata) Sanselan
 					.getMetadata(imageFile, params);
-			if(null==metadata)
+			if (null == metadata)
 				continue;
-//			assertNotNull(metadata.getExif());
+			//			assertNotNull(metadata.getExif());
 
 			metadata.dump();
 		}

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifRewriteTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifRewriteTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifRewriteTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/ExifRewriteTest.java Thu Jan 31 21:03:16 2008
@@ -57,6 +57,7 @@
 		List images = getImagesWithExifData();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);
@@ -99,6 +100,7 @@
 		List images = getImagesWithExifData();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);
@@ -182,6 +184,7 @@
 		List images = getImagesWithExifData();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/GpsTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/GpsTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/GpsTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/GpsTest.java Thu Jan 31 21:03:16 2008
@@ -32,15 +32,19 @@
 {
 
 	public void test() throws Exception
-
 	{
 
-		List images = getImagesWithExifData();
+		List images = getImagesWithExifData(300);
 		for (int i = 0; i < images.size(); i++)
 		{
-			Debug.purgeMemory();
+			if (i % 10 == 0)
+				Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);
+
+//			Debug.debug();
+//			Debug.debug("imageFile", imageFile);
+
 			if (imageFile.getParentFile().getName().toLowerCase().equals(
 					"@broken"))
 				continue;
@@ -67,6 +71,11 @@
 
 				Debug.debug("imageFile", imageFile);
 				Debug.debug("gpsInfo", gpsInfo);
+				Debug.debug("gpsInfo longitude as degrees east", gpsInfo
+						.getLongitudeAsDegreesEast());
+				Debug.debug("gpsInfo latitude as degrees north", gpsInfo
+						.getLatitudeAsDegreesNorth());
+
 				Debug.debug();
 			}
 			catch (Exception e)

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/SpecificExifTagTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/SpecificExifTagTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/SpecificExifTagTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/SpecificExifTagTest.java Thu Jan 31 21:03:16 2008
@@ -37,10 +37,10 @@
 		implements
 			AllTagConstants
 {
-//	public SpecificExifTagTest(String name)
-//	{
-//		super(name);
-//	}
+	//	public SpecificExifTagTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	public void testSingleImage() throws IOException, ImageReadException,
 			ImageWriteException
@@ -55,10 +55,12 @@
 		List images = getImagesWithExifData();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);
-			if (imageFile.getParentFile().getName().toLowerCase().equals("@broken"))
+			if (imageFile.getParentFile().getName().toLowerCase().equals(
+					"@broken"))
 				continue;
 			checkImage(imageFile);
 		}
@@ -70,7 +72,7 @@
 	private void checkImage(File imageFile) throws IOException,
 			ImageReadException, ImageWriteException
 	{
-//		Debug.debug("imageFile", imageFile.getAbsoluteFile());
+		//		Debug.debug("imageFile", imageFile.getAbsoluteFile());
 
 		Map params = new HashMap();
 		boolean ignoreImageData = isPhilHarveyTestImage(imageFile);

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/WriteExifMetadataExampleTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/WriteExifMetadataExampleTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/WriteExifMetadataExampleTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/exif/WriteExifMetadataExampleTest.java Thu Jan 31 21:03:16 2008
@@ -32,10 +32,10 @@
 		implements
 			AllTagConstants
 {
-//	public WriteExifMetadataExampleTest(String name)
-//	{
-//		super(name);
-//	}
+	//	public WriteExifMetadataExampleTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	public void test() throws IOException, ImageReadException,
 			ImageWriteException
@@ -43,8 +43,9 @@
 		List images = getImagesWithExifData();
 		for (int i = 0; i < images.size(); i++)
 		{
-			Debug.purgeMemory();
-			
+			if (i % 10 == 0)
+				Debug.purgeMemory();
+
 			File imageFile = (File) images.get(i);
 			Debug.debug("imageFile", imageFile.getAbsoluteFile());
 
@@ -55,7 +56,7 @@
 			try
 			{
 				boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
-				if(ignoreImageData)
+				if (ignoreImageData)
 					continue;
 				new WriteExifMetadataExample().changeExifMetadata(imageFile,
 						tempFile);

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngReadTest.java Thu Jan 31 21:03:16 2008
@@ -33,10 +33,10 @@
 
 public class PngReadTest extends SanselanTest
 {
-//	public PngReadTest(String name)
-//	{
-//		super(name);
-//	}
+	//	public PngReadTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	private static boolean isPng(File file) throws IOException,
 			ImageReadException
@@ -53,10 +53,10 @@
 		}
 	};
 
-//	private File getPngImage() throws IOException, ImageReadException
-//	{
-//		return getTestImage(imageFilter);
-//	}
+	//	private File getPngImage() throws IOException, ImageReadException
+	//	{
+	//		return getTestImage(imageFilter);
+	//	}
 
 	private List getPngImages() throws IOException, ImageReadException
 	{
@@ -71,6 +71,7 @@
 		List images = getPngImages();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);
@@ -88,21 +89,21 @@
 				catch (Exception e)
 				{
 				}
-				
+
 				try
 				{
 					ImageInfo imageInfo = Sanselan.getImageInfo(imageFile);
-//					assertNotNull(imageInfo);
+					//					assertNotNull(imageInfo);
 					fail("Image read should have failed.");
 				}
 				catch (Exception e)
 				{
 				}
-				
+
 				try
 				{
 					BufferedImage image = Sanselan.getBufferedImage(imageFile);
-//					assertNotNull(image);
+					//					assertNotNull(image);
 					fail("Image read should have failed.");
 				}
 				catch (Exception e)

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/tiff/TiffReadTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/tiff/TiffReadTest.java?rev=617350&r1=617349&r2=617350&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/tiff/TiffReadTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/tiff/TiffReadTest.java Thu Jan 31 21:03:16 2008
@@ -33,10 +33,10 @@
 
 public class TiffReadTest extends SanselanTest
 {
-//	public TiffReadTest(String name)
-//	{
-//		super(name);
-//	}
+	//	public TiffReadTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	private static boolean isTiff(File file) throws IOException,
 			ImageReadException
@@ -53,10 +53,10 @@
 		}
 	};
 
-//	private File getTiffImage() throws IOException, ImageReadException
-//	{
-//		return getTestImage(imageFilter);
-//	}
+	//	private File getTiffImage() throws IOException, ImageReadException
+	//	{
+	//		return getTestImage(imageFilter);
+	//	}
 
 	private List getTiffImages() throws IOException, ImageReadException
 	{
@@ -69,6 +69,7 @@
 		List images = getTiffImages();
 		for (int i = 0; i < images.size(); i++)
 		{
+			if(i%10==0)
 			Debug.purgeMemory();
 
 			File imageFile = (File) images.get(i);