#520: Fix for incorrect serialization of single element arrays in metadata.

This commit is contained in:
Harald Kuhr 2020-01-29 20:58:34 +01:00
parent 903289caa4
commit fb304d6c27
2 changed files with 42 additions and 3 deletions

View File

@ -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<Integer, Entry> entries = new LinkedHashMap<>();

View File

@ -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();