/*
* #%L
* Bio-Formats Plugins for ImageJ: a collection of ImageJ plugins including the
* Bio-Formats Importer, Bio-Formats Exporter, Bio-Formats Macro Extensions,
* Data Browser and Stack Slicer.
* %%
* Copyright (C) 2006 - 2015 Open Microscopy Environment:
* - Board of Regents of the University of Wisconsin-Madison
* - Glencoe Software, Inc.
* - University of Dundee
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
import ij.CompositeImage;
import ij.IJ;
import ij.ImagePlus;
import ij.ImageStack;
import ij.io.OpenDialog;
import ij.plugin.PlugIn;
import ij.process.ImageProcessor;
import ij.process.LUT;
import java.io.IOException;
import loci.formats.ChannelSeparator;
import loci.formats.FormatException;
import loci.formats.IFormatReader;
import loci.plugins.util.ImageProcessorReader;
import loci.plugins.util.LociPrefs;
/**
* An ImageJ plugin that uses Bio-Formats to build up an {@link ImageStack},
* reading image planes one by one.
*/
public class Read_Image implements PlugIn {
public void run(String arg) {
OpenDialog od = new OpenDialog("Open Image File...", arg);
String dir = od.getDirectory();
String name = od.getFileName();
String id = dir + name;
ImageProcessorReader r = new ImageProcessorReader(
new ChannelSeparator(LociPrefs.makeImageReader()));
try {
IJ.showStatus("Examining file " + name);
r.setId(id);
int num = r.getImageCount();
int width = r.getSizeX();
int height = r.getSizeY();
ImageStack stack = new ImageStack(width, height);
byte[][][] lookupTable = new byte[r.getSizeC()][][];
for (int i=0; i<num; i++) {
IJ.showStatus("Reading image plane #" + (i + 1) + "/" + num);
ImageProcessor ip = r.openProcessors(i)[0];
stack.addSlice("" + (i + 1), ip);
int channel = r.getZCTCoords(i)[1];
lookupTable[channel] = r.get8BitLookupTable();
}
IJ.showStatus("Constructing image");
ImagePlus imp = new ImagePlus(name, stack);
ImagePlus colorizedImage = applyLookupTables(r, imp, lookupTable);
r.close();
colorizedImage.show();
IJ.showStatus("");
}
catch (FormatException exc) {
IJ.error("Sorry, an error occurred: " + exc.getMessage());
}
catch (IOException exc) {
IJ.error("Sorry, an error occurred: " + exc.getMessage());
}
}
private ImagePlus applyLookupTables(IFormatReader r, ImagePlus imp,
byte[][][] lookupTable)
{
// apply color lookup tables, if present
// this requires ImageJ v1.39 or higher
if (r.isIndexed()) {
CompositeImage composite =
new CompositeImage(imp, CompositeImage.COLOR);
for (int c=0; c<r.getSizeC(); c++) {
composite.setPosition(c + 1, 1, 1);
LUT lut =
new LUT(lookupTable[c][0], lookupTable[c][1], lookupTable[c][2]);
composite.setChannelLut(lut);
}
composite.setPosition(1, 1, 1);
return composite;
}
return imp;
}
}