#290 TIFF Stream Medata support

This commit is contained in:
Harald Kuhr
2016-11-22 20:51:07 +01:00
parent 18705be7f6
commit 0b030dde52
6 changed files with 280 additions and 10 deletions
@@ -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 {
@@ -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();
@@ -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
}
}