package fr.unistra.pelican.algorithms.io; import fr.unistra.pelican.*; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.FileImageInputStream; import com.sun.media.jai.codec.FileSeekableStream; import com.sun.media.jai.codec.ImageCodec; import com.sun.media.jai.codec.ImageDecoder; /** * Load TIFF images. * * @author Lefevre */ public class TiffMultiplePageImageLoad extends Algorithm { /** * Input parameter */ public String filename; /** * Output parameter */ public Image output; /** * Constructor * */ public TiffMultiplePageImageLoad() { super.inputs = "filename"; super.outputs = "output"; } /** * Loads Tiff images. * * @param filename * Filename of the Tiff image. * @return The Tiff image. */ public static Image exec(String filename) { return (Image) new TiffMultiplePageImageLoad().process(filename); } public void launch() { try { ImageDecoder dec = ImageCodec.createImageDecoder("tiff", new FileSeekableStream(filename), null); int pages = dec.getNumPages(); System.err.println("Number of images in this TIFF: " + pages); FileImageInputStream inputStream = new FileImageInputStream(new File( filename)); ImageReader reader = ImageIO.getImageReadersBySuffix("tif").next(); reader.setInput(inputStream); output = null; for (int imageToLoad = 0; imageToLoad < dec.getNumPages(); imageToLoad++) { RenderedImage tiff = reader.readAsRenderedImage(imageToLoad, null); tiff.getData().getTransferType(); int width = tiff.getWidth(); int height = tiff.getHeight(); Raster r = tiff.getData(); int band = r.getNumBands(); Image page = null; switch (tiff.getColorModel().getPixelSize()) { case 32: if (output == null) output = new DoubleImage(width, height, pages, 1, band); page = new DoubleImage(width, height, 1, 1, band); for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) for (int b = 0; b < band; b++) page.setPixelXYBDouble(i, j, b, r.getSampleDouble(i, j, b)); output.setImage4D(page, imageToLoad, Image.Z); break; case 16: if (output == null) output = new IntegerImage(width, height, pages, 1, band); page = new IntegerImage(width, height, 1, 1, band); for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) for (int b = 0; b < band; b++) page.setPixelXYBInt(i, j, b, r.getSample(i, j, b)); output.setImage4D(page, imageToLoad, Image.Z); break; default: if (output == null) output = new ByteImage(width, height, pages, 1, band); page = new ByteImage(width, height, 1, 1, band); for (int i = 0; i < width; i++) for (int j = 0; j < height; j++) for (int b = 0; b < band; b++) page.setPixelXYBByte(i, j, b, (byte) r.getSample(i, j, b)); output.setImage4D(page, imageToLoad, Image.Z); break; } if (band == 3) output.setColor(true); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }