package fr.unistra.pelican.algorithms.io;
import java.awt.image.BufferedImage;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.media.jai.RasterFactory;
import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
import com.sun.media.imageioimpl.common.BogusColorSpace;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.DoubleImage;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.IntegerImage;
/**
* Save multiple-page TIFF images in 8, 16 or 32 bits
*
* @author Lefevre
*
*/
public class TiffMultiplePageImageSave extends Algorithm {
/**
* Image to be saved
*/
public Image input;
/**
* Name of the file
*/
public String filename;
/**
* Constructor
*/
public TiffMultiplePageImageSave() {
super.inputs = "input,filename";
}
/**
* Save Tiff images.
*
* @param input
* input image
* @param filename
* Filename of the Tiff image.
* @return The Tiff image.
*/
public static void exec(Image input, String filename) {
new TiffMultiplePageImageSave().process(input, filename);
}
public void launch() {
int xdim = input.getXDim();
int ydim = input.getYDim();
int zdim = input.getZDim();
int tdim = input.getTDim();
int bdim = input.getBDim();
try {
ImageWriter writer = ImageIO.getImageWritersByFormatName("tif").next();
ImageOutputStream ios = ImageIO
.createImageOutputStream(new File(filename));
writer.setOutput(ios);
writer.prepareWriteSequence(null);
TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(
Locale.ENGLISH);
tiffWriteParam.setCompressionMode(tiffWriteParam.MODE_DEFAULT);
for (int t = 0; t < tdim; t++)
for (int z = 0; z < zdim; z++) {
Image work = input;
if (tdim > 1)
work = work.getImage4D(t, Image.T);
if (zdim > 1)
work = work.getImage4D(z, Image.Z);
if (input instanceof DoubleImage) {
WritableRaster r = RasterFactory.createBandedRaster(
DataBuffer.TYPE_DOUBLE, xdim, ydim, bdim, null);
for (int b = 0; b < bdim; b++)
for (int y = 0; y < ydim; y++)
for (int x = 0; x < xdim; x++)
r.setSample(x, y, b, work.getPixelXYBDouble(x, y, b));
BogusColorSpace cs = new BogusColorSpace(bdim);
ComponentColorModel cm = new ComponentColorModel(cs, false, false,
1, DataBuffer.TYPE_DOUBLE);
BufferedImage img = new BufferedImage(cm, r, false, null);
IIOImage image = new IIOImage(img, null, writer
.getDefaultStreamMetadata(tiffWriteParam));
writer.writeToSequence(image, tiffWriteParam);
} else if (input instanceof IntegerImage) {
WritableRaster r = RasterFactory.createBandedRaster(
DataBuffer.TYPE_SHORT, xdim, ydim, bdim, null);
for (int b = 0; b < bdim; b++)
for (int y = 0; y < ydim; y++)
for (int x = 0; x < xdim; x++)
r.setSample(x, y, b, work.getPixelXYBInt(x, y, b));
BogusColorSpace cs = new BogusColorSpace(bdim);
ComponentColorModel cm = new ComponentColorModel(cs, false, false,
1, DataBuffer.TYPE_SHORT);
BufferedImage img = new BufferedImage(cm, r, false, null);
IIOImage image = new IIOImage(img, null, writer
.getDefaultStreamMetadata(tiffWriteParam));
writer.writeToSequence(image, tiffWriteParam);
} else {
WritableRaster r = RasterFactory.createBandedRaster(
DataBuffer.TYPE_BYTE, xdim, ydim, bdim, null);
for (int b = 0; b < bdim; b++)
for (int y = 0; y < ydim; y++)
for (int x = 0; x < xdim; x++)
r.setSample(x, y, b, work.getPixelXYBByte(x, y, b));
BogusColorSpace cs = new BogusColorSpace(bdim);
ComponentColorModel cm = new ComponentColorModel(cs, false, false,
1, DataBuffer.TYPE_BYTE);
BufferedImage img = new BufferedImage(cm, r, false, null);
IIOImage image = new IIOImage(img, null, writer
.getDefaultStreamMetadata(tiffWriteParam));
writer.writeToSequence(image, tiffWriteParam);
}
}
// for (int b = 0; b < bdim; b++)
// for (int t = 0; t < tdim; t++)
// for (int z = 0; z < zdim; z++) {
// SampleModel s = RasterFactory.createBandedSampleModel(
// DataBuffer.TYPE_BYTE, xdim, ydim, 1);
// BufferedImage img = ImageSave.imageToBufferedImage(input
// .getImage2D(z, t, b), s, BufferedImage.TYPE_BYTE_GRAY);
// IIOImage image = new IIOImage(img, null, writer
// .getDefaultStreamMetadata(tiffWriteParam));
// writer.writeToSequence(image, tiffWriteParam);
// }
writer.dispose();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}