/*
* Copyright (c) 2012 Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package uk.ac.diamond.scisoft.analysis.io;
import java.awt.image.RenderedImage;
import java.io.File;
import java.util.Collection;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream;
import javax.media.jai.PlanarImage;
import org.eclipse.dawnsci.analysis.api.io.IDataHolder;
import org.eclipse.january.metadata.IMetadata;
/**
* This class saves a DataHolder as a TIFF image file.
*/
public class TIFFImageSaver extends JavaImageSaver {
private static final String FORMAT_NAME = "tiff";
/**
* @param filename
*/
public TIFFImageSaver(String filename) {
this(filename, false);
}
/**
* @param filename
* @param numBits
*/
public TIFFImageSaver(String filename, int numBits) {
super(filename, FORMAT_NAME, numBits, true);
}
/**
* @param filename
* @param numBits
* @param asUnsigned
*/
public TIFFImageSaver(String filename, int numBits, boolean asUnsigned) {
super(filename, FORMAT_NAME, numBits, asUnsigned);
}
/**
* @param filename
* @param asFloat
*/
public TIFFImageSaver(String filename, boolean asFloat) {
super(filename, FORMAT_NAME, asFloat ? 33 : 16, true);
}
@Override
protected boolean writeImageLocked(RenderedImage image, String fileType, File f, IDataHolder dh) throws Exception {
// Write meta data to image header
if (image instanceof PlanarImage) {
PlanarImage pi = (PlanarImage)image;
if (dh.getFilePath()!=null) {
pi.setProperty("originalDataSource", dh.getFilePath());
}
IMetadata meta = dh.getMetadata();
if (meta != null) {
Collection<String> dNames = meta.getMetaNames();
if (dNames!=null) for (String name : dNames) {
pi.setProperty(name, meta.getMetaValue(name));
}
}
}
// special case to force little endian
ImageWriter writer = ImageIO.getImageWritersByFormatName(FORMAT_NAME).next();
IIOMetadata streamMeta = writer.getDefaultStreamMetadata(null);
String metadataFormatName = streamMeta.getNativeMetadataFormatName();
// Create the new stream metadata object for new byte order
IIOMetadataNode tree = new IIOMetadataNode(metadataFormatName);
IIOMetadataNode endianNode = new IIOMetadataNode("ByteOrder");
endianNode.setAttribute("value", "LITTLE_ENDIAN");
tree.appendChild(endianNode);
streamMeta.setFromTree(metadataFormatName, tree);
ImageOutputStream stream = ImageIO.createImageOutputStream(f);
writer.setOutput(stream);
writer.write(streamMeta, new IIOImage(image, null, null), null);
return true;
}
}