//
// Read_Image.java
//
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.
*
* <dl><dt><b>Source code:</b></dt>
* <dd><a href="http://trac.openmicroscopy.org.uk/ome/browser/bioformats.git/components/loci-plugins/utils/Read_Image.java">Trac</a>,
* <a href="http://git.openmicroscopy.org/?p=bioformats.git;a=blob;f=components/loci-plugins/utils/Read_Image.java;hb=HEAD">Gitweb</a></dd></dl>
*/
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;
}
}