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/08/24 20:47:31 UTC
svn commit: r688558 [2/2] - in /incubator/sanselan/trunk: ./
src/main/java/org/apache/sanselan/common/
src/main/java/org/apache/sanselan/formats/jpeg/
src/main/java/org/apache/sanselan/formats/jpeg/iptc/
src/main/java/org/apache/sanselan/formats/jpeg/s...
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/segments/App13Segment.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/segments/App13Segment.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/segments/App13Segment.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/segments/App13Segment.java Sun Aug 24 13:47:30 2008
@@ -19,17 +19,19 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.ArrayList;
+import java.util.Map;
import org.apache.sanselan.ImageReadException;
-import org.apache.sanselan.formats.jpeg.IptcElement;
-import org.apache.sanselan.formats.jpeg.IptcType;
import org.apache.sanselan.formats.jpeg.JpegImageParser;
+import org.apache.sanselan.formats.jpeg.iptc.IPTCParser;
+import org.apache.sanselan.formats.jpeg.iptc.PhotoshopApp13Data;
public class App13Segment extends APPNSegment
{
protected final JpegImageParser parser;
- public final ArrayList elements = new ArrayList();
+
+ // public final ArrayList elements = new ArrayList();
+ // public final boolean isIPTCJpegSegment;
public App13Segment(JpegImageParser parser, int marker, byte segmentData[])
throws ImageReadException, IOException
@@ -38,97 +40,43 @@
segmentData));
}
- // TODO:
public App13Segment(JpegImageParser parser, int marker, int marker_length,
InputStream is) throws ImageReadException, IOException
{
super(marker, marker_length, is);
this.parser = parser;
- boolean verbose = false;
-
- if (!compareByteArrays(bytes, 0,
- JpegImageParser.PhotoshopIdentificationString, 0,
- JpegImageParser.PhotoshopIdentificationString.length))
- throw new ImageReadException("Invalid App13 Segment");
- // readAndVerifyBytes("Photoshop Identification String", bais,
- // kPhotoshopIdentificationString, "Invalid App13 Segment");
-
- int index = JpegImageParser.PhotoshopIdentificationString.length;
- while (index < bytes.length)
- {
- if (!compareByteArrays(bytes, index, JpegImageParser.CONST_8BIM, 0,
- JpegImageParser.CONST_8BIM.length))
- {
- // dump(index);
- throw new ImageReadException("Invalid .CONST_8BIM Segment");
- }
- index += JpegImageParser.CONST_8BIM.length;
-
- int segmentType = convertByteArrayToShort("SegmentType", index,
- bytes);
- if (verbose)
- debugNumber("segmentType", segmentType, 2);
- index += 2;
-
- // padding
- index += 4;
-
- int segmentSize = convertByteArrayToShort("SegmentSize", index,
- bytes);
- if (verbose)
- debugNumber("segmentSize", segmentSize, 2);
- index += 2;
-
- int index2 = index;
-
- index += segmentSize;
-
- while (index2 + 1 < index)
- {
- int iptcPrefix = convertByteArrayToShort("IPTCPrefix", index2,
- bytes);
- if (verbose)
- debugNumber("IPTCPrefix", iptcPrefix, 2);
- index2 += 2;
-
- if (iptcPrefix == 0x1c02)
- {
- // System.out.println(" TEXTBLOCK: "
- // + fSegmentType);
- }
- else
- {
- // System.out.println(" !TEXTBLOCK: " + fSegmentType);
- break;
- }
-
- byte iptcSegmentType = bytes[index2];
- // debugNumber("fIPTCSegmentType", fIPTCSegmentType);
- index2++;
-
- int iptcSegmentSize = convertByteArrayToShort(
- "IPTCSegmentSize", index2, bytes);
- // debugNumber("fIPTCegmentSize", fIPTCegmentSize, 2);
- index2 += 2;
-
- byte iptcData[] = readBytearray("iptc_data", bytes, index2,
- iptcSegmentSize);
- index2 += iptcSegmentSize;
-
- String value = new String(iptcData);
- // System.out.println("iptc_data: '" + value + "' ("
- // + fIPTCegmentSize + ")");
-
- IptcType iptcType = IptcType.getIptcType(iptcSegmentType);
- IptcElement element = new IptcElement(iptcType, value);
- elements.add(element);
- }
-
- if ((segmentSize % 2) != 0)
- index++;
- }
+ // isIPTCJpegSegment = new IPTCParser().isIPTCJpegSegment(bytes);
+ // if (isIPTCJpegSegment)
+ // {
+ // /*
+ // * In practice, App13 segments are only used for Photoshop/IPTC
+ // * metadata. However, we should not treat App13 signatures without
+ // * Photoshop's signature as Photoshop/IPTC segments.
+ // */
+ // boolean verbose = false;
+ // boolean strict = false;
+ // elements.addAll(new IPTCParser().parseIPTCJPEGSegment(bytes,
+ // verbose, strict));
+ // }
+ }
+ public boolean isPhotoshopJpegSegment() throws ImageReadException, IOException
+ {
+ return new IPTCParser().isPhotoshopJpegSegment(bytes);
}
+ public PhotoshopApp13Data parsePhotoshopSegment(Map params)
+ throws ImageReadException, IOException
+ {
+ /*
+ * In practice, App13 segments are only used for Photoshop/IPTC
+ * metadata. However, we should not treat App13 signatures without
+ * Photoshop's signature as Photoshop/IPTC segments.
+ */
+ if (!new IPTCParser().isPhotoshopJpegSegment(bytes))
+ return null;
+
+ return new IPTCParser().parsePhotoshopSegment(bytes, params);
+ }
}
\ No newline at end of file
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java Sun Aug 24 13:47:30 2008
@@ -16,10 +16,7 @@
*/
package org.apache.sanselan.formats.jpeg.xmp;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@@ -28,16 +25,9 @@
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.common.BinaryFileParser;
import org.apache.sanselan.common.byteSources.ByteSource;
-import org.apache.sanselan.common.byteSources.ByteSourceArray;
-import org.apache.sanselan.common.byteSources.ByteSourceFile;
-import org.apache.sanselan.common.byteSources.ByteSourceInputStream;
import org.apache.sanselan.formats.jpeg.JpegConstants;
import org.apache.sanselan.formats.jpeg.JpegUtils;
-import org.apache.sanselan.formats.tiff.write.TiffImageWriterBase;
-import org.apache.sanselan.formats.tiff.write.TiffImageWriterLossless;
-import org.apache.sanselan.formats.tiff.write.TiffImageWriterLossy;
-import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
-import org.apache.sanselan.util.Debug;
+import org.apache.sanselan.formats.jpeg.iptc.IPTCParser;
/**
* Interface for Exif write/update/remove functionality for Jpeg/JFIF images.
@@ -76,6 +66,11 @@
protected abstract static class JFIFPiece
{
protected abstract void write(OutputStream os) throws IOException;
+
+ public String toString()
+ {
+ return "[" + this.getClass().getSimpleName() + "]";
+ }
}
protected static class JFIFPieceSegment extends JFIFPiece
@@ -88,7 +83,7 @@
public JFIFPieceSegment(final int marker, final byte[] segmentData)
{
this(marker, int2ToByteArray(marker, JPEG_BYTE_ORDER),
- int2ToByteArray(segmentData.length+2, JPEG_BYTE_ORDER),
+ int2ToByteArray(segmentData.length + 2, JPEG_BYTE_ORDER),
segmentData);
}
@@ -101,6 +96,11 @@
this.segmentData = segmentData;
}
+ public String toString()
+ {
+ return "[" + this.getClass().getSimpleName() + " (0x" + Integer.toHexString(marker) + ")]";
+ }
+
protected void write(OutputStream os) throws IOException
{
os.write(markerBytes);
@@ -127,6 +127,15 @@
return true;
}
+ public boolean isPhotoshopApp13Segment()
+ {
+ if (marker != JPEG_APP13_Marker)
+ return false;
+ if (!new IPTCParser().isPhotoshopJpegSegment(segmentData))
+ return false;
+ return true;
+ }
+
public boolean isXmpSegment()
{
if (marker != JPEG_APP1_Marker)
@@ -216,11 +225,28 @@
}
};
+ private static final SegmentFilter PHOTOSHOP_APP13_SEGMENT_FILTER = new SegmentFilter() {
+ public boolean filter(JFIFPieceSegment segment)
+ {
+ return segment.isPhotoshopApp13Segment();
+ }
+ };
+
protected List removeXmpSegments(List segments)
{
return filterSegments(segments, XMP_SEGMENT_FILTER);
}
+ protected List removePhotoshopApp13Segments(List segments)
+ {
+ return filterSegments(segments, PHOTOSHOP_APP13_SEGMENT_FILTER);
+ }
+
+ protected List findPhotoshopApp13Segments(List segments)
+ {
+ return filterSegments(segments, PHOTOSHOP_APP13_SEGMENT_FILTER, true);
+ }
+
protected List removeExifSegments(List segments)
{
return filterSegments(segments, EXIF_SEGMENT_FILTER);
@@ -228,6 +254,12 @@
protected List filterSegments(List segments, SegmentFilter filter)
{
+ return filterSegments(segments, filter, false);
+ }
+
+ protected List filterSegments(List segments, SegmentFilter filter,
+ boolean reverse)
+ {
List result = new ArrayList();
for (int i = 0; i < segments.size(); i++)
@@ -235,9 +267,9 @@
JFIFPiece piece = (JFIFPiece) segments.get(i);
if (piece instanceof JFIFPieceSegment)
{
- if (!filter.filter((JFIFPieceSegment) piece))
+ if (filter.filter((JFIFPieceSegment) piece) ^ !reverse)
result.add(piece);
- } else
+ } else if(!reverse)
result.add(piece);
}
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java Sun Aug 24 13:47:30 2008
@@ -22,9 +22,8 @@
import org.apache.sanselan.formats.tiff.TiffField;
import org.apache.sanselan.formats.tiff.constants.TiffConstants;
-public abstract class FieldType extends BinaryFileFunctions
- implements
- TiffConstants
+public abstract class FieldType extends BinaryFileFunctions implements
+ TiffConstants
{
public final int type, length;
public final String name;
@@ -49,7 +48,8 @@
return length * entry.length;
}
- // public static final byte[] STUB_LOCAL_VALUE = new byte[TIFF_ENTRY_MAX_VALUE_LENGTH];
+ // public static final byte[] STUB_LOCAL_VALUE = new
+ // byte[TIFF_ENTRY_MAX_VALUE_LENGTH];
public static final byte[] getStubLocalValue()
{
@@ -73,10 +73,14 @@
{
if (isLocalValue(entry))
{
- return readBytearray(name, entry.valueOffsetBytes, 0, length
- * entry.length);
- // return getBytearrayHead(name + " (" + entry.tagInfo.name + ")",
- // entry.valueOffsetBytes, length * entry.length);
+ int rawLength = length * entry.length;
+ byte result[] = new byte[rawLength];
+ System.arraycopy(entry.valueOffsetBytes, 0, result, 0, rawLength);
+ return result;
+// return readBytearray(name, entry.valueOffsetBytes, 0, length
+// * entry.length);
+ // return getBytearrayHead(name + " (" + entry.tagInfo.name + ")",
+ // entry.valueOffsetBytes, length * entry.length);
}
return entry.oversizeValue;
@@ -85,17 +89,17 @@
public abstract Object getSimpleValue(TiffField entry)
throws ImageReadException;
- // public final Object getSimpleValue(TiffField entry)
- // {
- // Object array[] = getValueArray(entry);
- // if (null == array)
- // return null;
- // if (array.length == 1)
- // return array[0];
- // return array;
- // }
+ // public final Object getSimpleValue(TiffField entry)
+ // {
+ // Object array[] = getValueArray(entry);
+ // if (null == array)
+ // return null;
+ // if (array.length == 1)
+ // return array[0];
+ // return array;
+ // }
//
- // public abstract Object[] getValueArray(TiffField entry);
+ // public abstract Object[] getValueArray(TiffField entry);
public String toString()
{
Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeASCII.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeASCII.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeASCII.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeASCII.java Sun Aug 24 13:47:30 2008
@@ -26,7 +26,7 @@
super(type, 1, name);
}
- public Object getSimpleValue(TiffField entry)
+ public Object getSimpleValue(TiffField entry)
{
return new String(getRawBytes(entry));
}
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=688558&r1=688557&r2=688558&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 Sun Aug 24 13:47:30 2008
@@ -116,22 +116,43 @@
File testFolder = new File(srcFolder, "test");
File dataFolder = new File(testFolder, "data");
File imagesFolder = new File(dataFolder, "images");
-
-// imagesFolder = new File(imagesFolder, "ignore\\xml-sdk-examples\\BlueSquare.psd");
-// imagesFolder = new File(imagesFolder, "ignore\\PngSuite\\BGYN6A16.PNG");
+
+ // imagesFolder = new File(imagesFolder,
+ // "ignore\\xml-sdk-examples\\BlueSquare.psd");
+ // imagesFolder = new File(imagesFolder,
+ // "exif\\drewNoakes\\007_Canon EOS D60.jpg");
+ // imagesFolder = new File(imagesFolder,
+ // "ignore\\PngSuite\\BGYN6A16.PNG");
// imagesFolder = new File(imagesFolder, "jpg\\3");
// imagesFolder = new File(imagesFolder, "");
// imagesFolder = new File(imagesFolder,
// "exif\\philHarvey\\Nokia\\Nokia5500.jpg");
-// imagesFolder = new File(imagesFolder, "png\\2\\");
+ // imagesFolder = new File(imagesFolder, "png\\2\\");
// imagesFolder = new File(imagesFolder,
// "exif\\drewNoakes\\007_FujiFilm FinePixS1Pro (5).jpg");
+ // imagesFolder = new File(imagesFolder,
+ // "iptc");
// src\\test\\data\\images\\exif\\drewNoakes\\007_Nikon D1X.jpg
// src\\test\\data\\images\\exif\\drewNoakes\\007_FujiFilm FinePixS1Pro
// (5).jpg
+ // imagesFolder = new File(imagesFolder,
+ // "exif\\drewNoakes\\007_Nikon D70.jpg");
+ // imagesFolder = new File(imagesFolder,
+ // "exif\\philHarvey\\Canon\\CanonEOS_D2000.jpg");
+ // imagesFolder = new File(imagesFolder,
+ // "exif\\philHarvey\\Motorola\\MotorolaE365.jpg");
+ // imagesFolder = new File(
+ // "C:\\work\\personal\\apache\\sanselan\\src\\test\\data\\images\\exif\\drewNoakes\\007_Canon EOS D60.jpg"
+ // );
+ // imagesFolder = new File(
+ // "C:\\work\\personal\\apache\\sanselan\\src\\test\\data\\images\\exif\\drewNoakes\\007_FujiFilm FinePixS1Pro (1).jpg"
+ // );
+ // imagesFolder = new File(
+ // "C:\\work\\personal\\apache\\sanselan\\src\\test\\data\\images\\exif\\philHarvey\\Nikon\\NikonCoolpixS7.jpg"
+ // );
imagesFolder = imagesFolder.getAbsoluteFile();
-
+
assertTrue(imagesFolder.exists());
Debug.debug("imagesFolder", imagesFolder);
@@ -188,4 +209,10 @@
return filtered;
}
+
+ protected boolean isInvalidPNGTestFile(File file)
+ {
+ return (file.getParentFile().getName().equalsIgnoreCase("pngsuite") && file
+ .getName().toLowerCase().startsWith("x"));
+ }
}
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=688558&r1=688557&r2=688558&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 Sun Aug 24 13:47:30 2008
@@ -56,6 +56,7 @@
IImageMetadata metadata = Sanselan.getMetadata(imageFile, params);
// assertNotNull(metadata);
+ Debug.debug("metadata", metadata);
ImageInfo imageInfo = Sanselan.getImageInfo(imageFile, params);
assertNotNull(imageInfo);
Added: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java?rev=688558&view=auto
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java (added)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java Sun Aug 24 13:47:30 2008
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.sanselan.formats.jpeg.iptc;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.SanselanTest;
+import org.apache.sanselan.common.byteSources.ByteSource;
+import org.apache.sanselan.common.byteSources.ByteSourceFile;
+import org.apache.sanselan.formats.jpeg.JpegImageParser;
+
+public abstract class IptcBaseTest extends SanselanTest
+{
+ // public IptcBaseTest(String name)
+ // {
+ // super(name);
+ // }
+
+ protected static boolean hasIptcData(File file) throws IOException,
+ ImageReadException
+ {
+ // Debug.debug("hasIptcData file", file.getAbsoluteFile());
+
+ if (!file.getName().toLowerCase().endsWith(".jpg"))
+ return false;
+ //ImageFormat format = Sanselan.guessFormat(file);
+ //if (format != ImageFormat.IMAGE_FORMAT_JPEG)
+ // return false;
+
+ // Debug.debug("possible file", file);
+
+ try
+ {
+ ByteSource byteSource = new ByteSourceFile(file);
+ return new JpegImageParser().hasIptcSegment(byteSource);
+ }
+ catch (Exception e)
+ {
+ // Debug.debug("Error file", file.getAbsoluteFile());
+ // Debug.debug(e, 4);
+ return false;
+ }
+ }
+
+ private static final ImageFilter HAS_IPTC_IMAGE_FILTER = new ImageFilter()
+ {
+ public boolean accept(File file) throws IOException, ImageReadException
+ {
+ return hasIptcData(file);
+ }
+ };
+
+ private static final ImageFilter JPEG_IMAGE_FILTER = new ImageFilter()
+ {
+ public boolean accept(File file) throws IOException, ImageReadException
+ {
+ return file.getName().toLowerCase().endsWith(".jpg");
+ }
+ };
+
+ protected File getImageWithIptcData() throws IOException,
+ ImageReadException
+ {
+ return getTestImage(HAS_IPTC_IMAGE_FILTER);
+ }
+
+ protected List getImagesWithIptcData() throws IOException,
+ ImageReadException
+ {
+ return getTestImages(HAS_IPTC_IMAGE_FILTER);
+ }
+
+ protected List getImagesWithIptcData(int max) throws IOException,
+ ImageReadException
+ {
+ return getTestImages(HAS_IPTC_IMAGE_FILTER, max);
+ }
+
+ protected File getJpegImage() throws IOException, ImageReadException
+ {
+ return getTestImage(JPEG_IMAGE_FILTER);
+ }
+
+ protected List getJpegImages() throws IOException, ImageReadException
+ {
+ return getTestImages(JPEG_IMAGE_FILTER);
+ }
+
+ protected List getJpegImages(int max) throws IOException,
+ ImageReadException
+ {
+ return getTestImages(JPEG_IMAGE_FILTER, max);
+ }
+
+}
Propchange: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java?rev=688558&view=auto
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java (added)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java Sun Aug 24 13:47:30 2008
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.sanselan.formats.jpeg.iptc;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.ImageWriteException;
+import org.apache.sanselan.Sanselan;
+import org.apache.sanselan.common.byteSources.ByteSource;
+import org.apache.sanselan.common.byteSources.ByteSourceFile;
+import org.apache.sanselan.formats.jpeg.JpegImageMetadata;
+import org.apache.sanselan.formats.jpeg.JpegUtils;
+import org.apache.sanselan.util.Debug;
+
+public class IptcDumpTest extends IptcBaseTest
+{
+
+ public void test() throws IOException, ImageReadException,
+ ImageWriteException
+ {
+ List images = getImagesWithIptcData();
+ for (int i = 0; i < images.size(); i++)
+ {
+ if (i % 10 == 0)
+ Debug.purgeMemory();
+
+ File imageFile = (File) images.get(i);
+ Debug.debug("imageFile", imageFile);
+ Debug.debug();
+
+ // ByteSource byteSource = new ByteSourceFile(imageFile);
+ // Debug.debug("Segments:");
+ // new JpegUtils().dumpJFIF(byteSource);
+
+ Map params = new HashMap();
+ boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
+ params
+ .put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
+ !ignoreImageData));
+// params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
+
+ JpegImageMetadata metadata = (JpegImageMetadata) Sanselan
+ .getMetadata(imageFile, params);
+ assertNotNull(metadata);
+ assertNotNull(metadata.getPhotoshop());
+
+ metadata.getPhotoshop().dump();
+ // if(metadata.getPhotoshop().getItems().size()>0)
+// Debug.debug("iptc size", metadata.getPhotoshop().getItems().size());
+ }
+ }
+
+}
Propchange: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java?rev=688558&view=auto
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java (added)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java Sun Aug 24 13:47:30 2008
@@ -0,0 +1,308 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.sanselan.formats.jpeg.iptc;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.ImageWriteException;
+import org.apache.sanselan.common.byteSources.ByteSource;
+import org.apache.sanselan.common.byteSources.ByteSourceFile;
+import org.apache.sanselan.formats.jpeg.JpegImageParser;
+import org.apache.sanselan.formats.jpeg.JpegPhotoshopMetadata;
+import org.apache.sanselan.formats.jpeg.JpegUtils;
+import org.apache.sanselan.util.Debug;
+
+public class IptcUpdateTest extends IptcBaseTest
+{
+ private List imagesWithIptcData;
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+
+ imagesWithIptcData = getImagesWithIptcData();
+ }
+
+// public void testRemove() throws IOException, ImageReadException,
+// ImageWriteException
+// {
+// List images = imagesWithIptcData;
+// for (int i = 0; i < images.size(); i++)
+// {
+// if (i % 10 == 0)
+// Debug.purgeMemory();
+//
+// File imageFile = (File) images.get(i);
+// Debug.debug("imageFile", imageFile);
+// Debug.debug();
+//
+// ByteSource byteSource = new ByteSourceFile(imageFile);
+// // Debug.debug("Segments:");
+// // new JpegUtils().dumpJFIF(byteSource);
+//
+// Map params = new HashMap();
+// boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
+// params
+// .put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
+// !ignoreImageData));
+// // params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
+// // params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
+//
+// JpegPhotoshopMetadata metadata = new JpegImageParser()
+// .getPhotoshopMetadata(byteSource, params);
+// assertNotNull(metadata);
+// metadata.dump();
+//
+// File noIptcFile = createTempFile(imageFile.getName()
+// + ".iptc.remove.", ".jpg");
+// {
+// // test remove
+//
+// OutputStream os = null;
+// try
+// {
+// os = new FileOutputStream(noIptcFile);
+// os = new BufferedOutputStream(os);
+// new JpegIptcRewriter().removeIPTC(byteSource, os);
+// } finally
+// {
+// os.close();
+// os = null;
+// }
+//
+// // Debug.debug("Source Segments:");
+// // new JpegUtils().dumpJFIF(new ByteSourceFile(noIptcFile));
+//
+// JpegPhotoshopMetadata outMetadata = new JpegImageParser()
+// .getPhotoshopMetadata(new ByteSourceFile(noIptcFile),
+// params);
+// assertTrue(outMetadata == null
+// || outMetadata.getItems().size() == 0);
+// }
+//
+// }
+// }
+
+ public void testRemoveInsertUpdate() throws IOException,
+ ImageReadException, ImageWriteException
+ {
+ List images = imagesWithIptcData;
+ for (int i = 0; i < images.size(); i++)
+ {
+ if (i % 10 == 0)
+ Debug.purgeMemory();
+
+ File imageFile = (File) images.get(i);
+ Debug.debug("imageFile", imageFile);
+ Debug.debug();
+
+ ByteSource byteSource = new ByteSourceFile(imageFile);
+ // Debug.debug("Segments:");
+ // new JpegUtils().dumpJFIF(byteSource);
+
+ Map params = new HashMap();
+ boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
+ params
+ .put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
+ !ignoreImageData));
+ // params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
+ // params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
+
+ JpegPhotoshopMetadata metadata = new JpegImageParser()
+ .getPhotoshopMetadata(byteSource, params);
+ assertNotNull(metadata);
+ metadata.dump();
+
+ File noIptcFile = createTempFile(imageFile.getName()
+ + ".iptc.remove.", ".jpg");
+ {
+ // test remove
+
+ OutputStream os = null;
+ try
+ {
+ os = new FileOutputStream(noIptcFile);
+ os = new BufferedOutputStream(os);
+ new JpegIptcRewriter().removeIPTC(byteSource, os);
+ } finally
+ {
+ os.close();
+ os = null;
+ }
+
+ // Debug.debug("Source Segments:");
+ // new JpegUtils().dumpJFIF(new ByteSourceFile(noIptcFile));
+
+ JpegPhotoshopMetadata outMetadata = new JpegImageParser()
+ .getPhotoshopMetadata(new ByteSourceFile(noIptcFile),
+ params);
+ assertTrue(outMetadata == null
+ || outMetadata.getItems().size() == 0);
+ }
+ {
+ // test no-change update
+
+ List newBlocks = metadata.photoshopApp13Data.getNonIptcBlocks();
+ List oldRecords = metadata.photoshopApp13Data.getRecords();
+ List newRecords = new ArrayList();
+ for (int j = 0; j < oldRecords.size(); j++)
+ {
+ IPTCRecord record = (IPTCRecord) oldRecords.get(j);
+ if (record.iptcType.type != IPTCConstants.IPTC_TYPE_CITY.type
+ && record.iptcType.type != IPTCConstants.IPTC_TYPE_CREDIT.type)
+ newRecords.add(record);
+ }
+
+ newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CITY,
+ "Albany, NY"));
+ newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CREDIT,
+ "William Sorensen"));
+
+ PhotoshopApp13Data newData = new PhotoshopApp13Data(newRecords,
+ newBlocks);
+
+ File updated = createTempFile(imageFile.getName()
+ + ".iptc.update.", ".jpg");
+ OutputStream os = null;
+ try
+ {
+ os = new FileOutputStream(updated);
+ os = new BufferedOutputStream(os);
+ new JpegIptcRewriter().writeIPTC(byteSource, os, newData);
+ } finally
+ {
+ os.close();
+ os = null;
+ }
+
+ // Debug.debug("Source Segments:");
+ // new JpegUtils().dumpJFIF(new ByteSourceFile(updated));
+
+ ByteSource updateByteSource = new ByteSourceFile(updated);
+ JpegPhotoshopMetadata outMetadata = new JpegImageParser()
+ .getPhotoshopMetadata(updateByteSource, params);
+
+ // Debug.debug("outMetadata", outMetadata.toString());
+ // Debug.debug("hasIptcSegment", new JpegImageParser()
+ // .hasIptcSegment(updateByteSource));
+
+ assertNotNull(outMetadata);
+ assertTrue(outMetadata.getItems().size() == newRecords.size());
+ // assertEquals(metadata.toString(), outMetadata.toString());
+ }
+
+ {
+ // test update
+
+ List newBlocks = metadata.photoshopApp13Data.getNonIptcBlocks();
+ List newRecords = new ArrayList();
+
+ newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CITY,
+ "Albany, NY"));
+ newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CREDIT,
+ "William Sorensen"));
+
+ PhotoshopApp13Data newData = new PhotoshopApp13Data(newRecords,
+ newBlocks);
+
+ File updated = createTempFile(imageFile.getName()
+ + ".iptc.update.", ".jpg");
+ OutputStream os = null;
+ try
+ {
+ os = new FileOutputStream(updated);
+ os = new BufferedOutputStream(os);
+ new JpegIptcRewriter().writeIPTC(byteSource, os, newData);
+ } finally
+ {
+ os.close();
+ os = null;
+ }
+
+ // Debug.debug("Source Segments:");
+ // new JpegUtils().dumpJFIF(new ByteSourceFile(updated));
+
+ ByteSource updateByteSource = new ByteSourceFile(updated);
+ JpegPhotoshopMetadata outMetadata = new JpegImageParser()
+ .getPhotoshopMetadata(updateByteSource, params);
+
+ // Debug.debug("outMetadata", outMetadata.toString());
+ // Debug.debug("hasIptcSegment", new JpegImageParser()
+ // .hasIptcSegment(updateByteSource));
+
+ assertNotNull(outMetadata);
+ assertTrue(outMetadata.getItems().size() == 2);
+ // assertEquals(metadata.toString(), outMetadata.toString());
+ }
+
+ {
+ // test insert
+
+ List newBlocks = new ArrayList();
+ List newRecords = new ArrayList();
+
+ newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CITY,
+ "Albany, NY"));
+ newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CREDIT,
+ "William Sorensen"));
+
+ PhotoshopApp13Data newData = new PhotoshopApp13Data(newRecords,
+ newBlocks);
+
+ File updated = createTempFile(imageFile.getName()
+ + ".iptc.insert.", ".jpg");
+ OutputStream os = null;
+ try
+ {
+ os = new FileOutputStream(updated);
+ os = new BufferedOutputStream(os);
+ new JpegIptcRewriter().writeIPTC(new ByteSourceFile(noIptcFile), os, newData);
+ } finally
+ {
+ os.close();
+ os = null;
+ }
+
+ // Debug.debug("Source Segments:");
+ // new JpegUtils().dumpJFIF(new ByteSourceFile(updated));
+
+ ByteSource updateByteSource = new ByteSourceFile(updated);
+ JpegPhotoshopMetadata outMetadata = new JpegImageParser()
+ .getPhotoshopMetadata(updateByteSource, params);
+
+ // Debug.debug("outMetadata", outMetadata.toString());
+ // Debug.debug("hasIptcSegment", new JpegImageParser()
+ // .hasIptcSegment(updateByteSource));
+
+ assertNotNull(outMetadata);
+ assertTrue(outMetadata.getItems().size() == 2);
+ // assertEquals(metadata.toString(), outMetadata.toString());
+ }
+
+ }
+ }
+}
Propchange: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpBaseTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpBaseTest.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpBaseTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpBaseTest.java Sun Aug 24 13:47:30 2008
@@ -70,19 +70,19 @@
// }
// };
- protected File getImageWithIptcData() throws IOException,
+ protected File getImageWithXmpData() throws IOException,
ImageReadException
{
return getTestImage(HAS_JPEG_XMP_IMAGE_FILTER);
}
- protected List getImagesWithIptcData() throws IOException,
+ protected List getImagesWithXmpData() throws IOException,
ImageReadException
{
return getTestImages(HAS_JPEG_XMP_IMAGE_FILTER);
}
- protected List getImagesWithIptcData(int max) throws IOException,
+ protected List getImagesWithXmpData(int max) throws IOException,
ImageReadException
{
return getTestImages(HAS_JPEG_XMP_IMAGE_FILTER, max);
Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpDumpTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpDumpTest.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpDumpTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpDumpTest.java Sun Aug 24 13:47:30 2008
@@ -36,7 +36,7 @@
public void test() throws IOException, ImageReadException,
ImageWriteException
{
- List images = getImagesWithIptcData();
+ List images = getImagesWithXmpData();
for (int i = 0; i < images.size(); i++)
{
if (i % 10 == 0)
Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriteTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriteTest.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriteTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriteTest.java Sun Aug 24 13:47:30 2008
@@ -37,10 +37,10 @@
public class JpegXmpRewriteTest extends JpegXmpBaseTest
{
- public void testRemove() throws IOException, ImageReadException,
+ public void testRemoveInsertUpdate() throws IOException, ImageReadException,
ImageWriteException
{
- List images = getImagesWithIptcData();
+ List images = getImagesWithXmpData();
for (int i = 0; i < images.size(); i++)
{
if (i % 10 == 0)
Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngBaseTest.java Sun Aug 24 13:47:30 2008
@@ -53,10 +53,6 @@
return getTestImages(imageFilter);
}
- protected boolean isInvalidPNGTestFile(File file)
- {
- return (file.getParentFile().getName().equalsIgnoreCase("pngsuite") && file
- .getName().toLowerCase().startsWith("x"));
- }
+
}
Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngMultipleRoundtripTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngMultipleRoundtripTest.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngMultipleRoundtripTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/png/PngMultipleRoundtripTest.java Sun Aug 24 13:47:30 2008
@@ -20,9 +20,7 @@
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import org.apache.sanselan.ImageFormat;
@@ -38,7 +36,7 @@
ImageWriteException
{
File imagesFolder = new File("src\\test\\data\\images\\png\\3");
- assert(imagesFolder.exists() && imagesFolder.isDirectory());
+ assertTrue(imagesFolder.exists() && imagesFolder.isDirectory());
File files[] = imagesFolder.listFiles();
for (int i = 0; i < files.length; i++)
Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpDumpTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpDumpTest.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpDumpTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpDumpTest.java Sun Aug 24 13:47:30 2008
@@ -45,13 +45,18 @@
Debug.purgeMemory();
File imageFile = (File) images.get(i);
+
+ if (imageFile.getName().toLowerCase().endsWith(".png")
+ && isInvalidPNGTestFile(imageFile))
+ continue;
+
Debug.debug("imageFile", imageFile);
Debug.debug();
String xmpXml = Sanselan.getXmpXml(imageFile);
- if(null==xmpXml)
+ if (null == xmpXml)
continue;
-
+
assertNotNull(xmpXml);
Debug.debug("xmpXml", xmpXml);
Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpUpdateTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpUpdateTest.java?rev=688558&r1=688557&r2=688558&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpUpdateTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/xmp/XmpUpdateTest.java Sun Aug 24 13:47:30 2008
@@ -44,6 +44,11 @@
Debug.purgeMemory();
File imageFile = (File) images.get(i);
+
+ if (imageFile.getName().toLowerCase().endsWith(".png")
+ && isInvalidPNGTestFile(imageFile))
+ continue;
+
Debug.debug("imageFile", imageFile);
Debug.debug();