From 0b030dde52e6b7a5e051776aeafda14c36535608 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Tue, 22 Nov 2016 20:51:07 +0100 Subject: [PATCH] #290 TIFF Stream Medata support --- .../imageio/plugins/tiff/TIFFImageReader.java | 7 +- .../imageio/plugins/tiff/TIFFImageWriter.java | 5 +- .../plugins/tiff/TIFFStreamMetadata.java | 25 +++- .../plugins/tiff/TIFFImageReaderTest.java | 43 ++++++ .../plugins/tiff/TIFFImageWriterTest.java | 71 ++++++++- .../plugins/tiff/TIFFStreamMetadataTest.java | 139 ++++++++++++++++++ 6 files changed, 280 insertions(+), 10 deletions(-) create mode 100644 imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadataTest.java diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java index 9a0aa8c6..ba4d02d8 100755 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReader.java @@ -75,7 +75,7 @@ import java.util.*; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; -import static com.twelvemonkeys.imageio.util.IIOUtil.*; +import static com.twelvemonkeys.imageio.util.IIOUtil.createStreamAdapter; import static com.twelvemonkeys.imageio.util.IIOUtil.lookupProviderByName; /** @@ -2113,8 +2113,9 @@ public final class TIFFImageReader extends ImageReaderBase { @Override public IIOMetadata getStreamMetadata() throws IOException { - // TODO: - return super.getStreamMetadata(); + readMetadata(); + + return new TIFFStreamMetadata(imageInput.getByteOrder()); } public static void main(final String[] args) throws IOException { diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java index 5b66933b..b82dae63 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java @@ -60,6 +60,8 @@ import java.util.*; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; +import static com.twelvemonkeys.imageio.plugins.tiff.TIFFStreamMetadata.configureStreamByteOrder; + /** * TIFFImageWriter * @@ -195,9 +197,8 @@ public final class TIFFImageWriter extends ImageWriterBase { @Override public void write(final IIOMetadata streamMetadata, final IIOImage image, final ImageWriteParam param) throws IOException { - // TODO: Validate input assertOutput(); - // TODO: streamMetadata? + configureStreamByteOrder(streamMetadata, imageOutput); // TODO: Make TIFFEntry and possibly TIFFDirectory? public EXIFWriter exifWriter = new EXIFWriter(); diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java index af1e38ab..17ec1010 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java @@ -35,8 +35,10 @@ import org.w3c.dom.Node; import javax.imageio.metadata.IIOInvalidTreeException; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; +import javax.imageio.stream.ImageOutputStream; import java.nio.ByteOrder; +import static com.twelvemonkeys.lang.Validate.notNull; import static java.nio.ByteOrder.BIG_ENDIAN; /** @@ -56,6 +58,10 @@ public final class TIFFStreamMetadata extends IIOMetadata { super(false, SUN_NATIVE_STREAM_METADATA_FORMAT_NAME, null, null, null); } + TIFFStreamMetadata(final ByteOrder byteOrder) { + this(); + this.byteOrder = byteOrder; + } @Override public boolean isReadOnly() { @@ -78,7 +84,7 @@ public final class TIFFStreamMetadata extends IIOMetadata { @Override public void mergeTree(final String formatName, final Node root) throws IIOInvalidTreeException { Validate.isTrue(nativeMetadataFormatName.equals(formatName), formatName, "Unsupported metadata format: %s"); - Validate.notNull(root, "root"); + notNull(root, "root"); if (!nativeMetadataFormatName.equals(root.getNodeName())) { throw new IIOInvalidTreeException("Root must be " + nativeMetadataFormatName, root); @@ -90,8 +96,8 @@ public final class TIFFStreamMetadata extends IIOMetadata { } NamedNodeMap attributes = node.getAttributes(); - String value = attributes.getNamedItem("value").getNodeValue(); + String value = attributes.getNamedItem("value").getNodeValue(); if (value == null) { throw new IIOInvalidTreeException("Missing \"value\" attribute in \"ByteOrder\" node", node); } @@ -121,4 +127,19 @@ public final class TIFFStreamMetadata extends IIOMetadata { // Big endian is always the default byteOrder = BIG_ENDIAN; } + + static void configureStreamByteOrder(final IIOMetadata streamMetadata, final ImageOutputStream imageOutput) throws IIOInvalidTreeException { + notNull(imageOutput, "imageOutput"); + + if (streamMetadata instanceof TIFFStreamMetadata) { + imageOutput.setByteOrder(((TIFFStreamMetadata) streamMetadata).byteOrder); + } + else if (streamMetadata != null) { + TIFFStreamMetadata metadata = new TIFFStreamMetadata(); + // Will throw exception if stream format differs from native + metadata.mergeTree(metadata.nativeMetadataFormatName, streamMetadata.getAsTree(metadata.nativeMetadataFormatName)); + imageOutput.setByteOrder(metadata.byteOrder); + } + // else, leave as-is + } } diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java index 7389d73a..901dab2a 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java @@ -34,16 +34,19 @@ import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.event.IIOReadWarningListener; +import javax.imageio.metadata.IIOMetadata; import javax.imageio.spi.ImageReaderSpi; import javax.imageio.stream.ImageInputStream; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; +import java.nio.ByteOrder; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; import static org.junit.internal.matchers.StringContains.containsString; import static org.mockito.Matchers.contains; @@ -560,4 +563,44 @@ public class TIFFImageReaderTest extends ImageReaderAbstractTest