diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageMetadata.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageMetadata.java index dda6005c..2b3df03d 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageMetadata.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageMetadata.java @@ -144,7 +144,7 @@ public final class TIFFImageMetadata extends AbstractMetadata { IIOMetadataNode valueNode = new IIOMetadataNode("TIFFUndefined"); tagNode.appendChild(valueNode); - if (count == 1) { + if (count == 1 && (value == null || !value.getClass().isArray())) { valueNode.setAttribute("value", String.valueOf(value)); } else { @@ -160,7 +160,7 @@ public final class TIFFImageMetadata extends AbstractMetadata { String typeName = getMetadataType(tag); // NOTE: ASCII/Strings have count 1, always. This seems consistent with the JAI ImageIO version. - if (count == 1) { + if (count == 1 && (value == null || !value.getClass().isArray())) { IIOMetadataNode elementNode = new IIOMetadataNode(typeName); valueNode.appendChild(elementNode); @@ -915,7 +915,7 @@ public final class TIFFImageMetadata extends AbstractMetadata { public void setFromTree(final String formatName, final Node root) throws IIOInvalidTreeException { // Standard validation - super.mergeTree(formatName, root); + super.setFromTree(formatName, root); // Set by "merging" with empty map LinkedHashMap entries = new LinkedHashMap<>(); diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java index 9f971437..f04ad28d 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java @@ -1072,6 +1072,45 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTest { assertArrayEquals(new byte[] {'I', 'I', 42, 0}, Arrays.copyOf(bytes, 4)); } + @Test + public void testMergeTreeARGB() throws IOException { + ImageWriter writer = createImageWriter(); + ImageWriteParam writeParam = writer.getDefaultWriteParam(); + writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + writeParam.setCompressionType("LZW"); + + IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_4BYTE_ABGR), writeParam); + + IIOMetadataNode tiffTree = (IIOMetadataNode) metadata.getAsTree(metadata.getNativeMetadataFormatName()); + metadata.setFromTree(metadata.getNativeMetadataFormatName(), tiffTree); + } + + @Test + public void testMergeTreeGray() throws IOException { + ImageWriter writer = createImageWriter(); + ImageWriteParam writeParam = writer.getDefaultWriteParam(); + writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + writeParam.setCompressionType("LZW"); + + IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY), writeParam); + + IIOMetadataNode tiffTree = (IIOMetadataNode) metadata.getAsTree(metadata.getNativeMetadataFormatName()); + metadata.setFromTree(metadata.getNativeMetadataFormatName(), tiffTree); + } + + @Test + public void testMergeTreeBW() throws IOException { + ImageWriter writer = createImageWriter(); + ImageWriteParam writeParam = writer.getDefaultWriteParam(); + writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + writeParam.setCompressionType("CCITT T.6"); + + IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_BINARY), writeParam); + + IIOMetadataNode tiffTree = (IIOMetadataNode) metadata.getAsTree(metadata.getNativeMetadataFormatName()); + metadata.setFromTree(metadata.getNativeMetadataFormatName(), tiffTree); + } + @Test public void testRewrite() throws IOException { ImageWriter writer = createImageWriter();