|
RGBStackConverter |
|
package ij.plugin; import java.awt.*; import ij.*; import ij.process.*; import ij.gui.*; /** Converts a 2 or 3 slice stack to RGB. */ public class RGBStackConverter implements PlugIn { public void run(String arg) { ImagePlus imp = IJ.getImage(); CompositeImage cimg = imp instanceof CompositeImage?(CompositeImage)imp:null; int size = imp.getStackSize(); if ((size<2||size>3) && cimg==null) { IJ.error("2 or 3 slice stack, or composite color stack, required"); return; } int type = imp.getType(); if (!(type==ImagePlus.GRAY8 || type==ImagePlus.GRAY16)) { IJ.error("8-bit or 16-bit grayscale stack required"); return; } if (!imp.lock()) return; Undo.reset(); String title = imp.getTitle()+" (RGB)"; if (cimg!=null) { ImagePlus imp2 = imp.createImagePlus(); imp2.setProcessor(title, new ColorProcessor(imp.getImage())); imp2.show(); } else if (type==ImagePlus.GRAY16) { sixteenBitsToRGB(imp); } else { ImagePlus imp2 = imp.createImagePlus(); imp2.setStack(title, imp.getStack()); ImageConverter ic = new ImageConverter(imp2); ic.convertRGBStackToRGB(); imp2.show(); } imp.unlock(); } void sixteenBitsToRGB(ImagePlus imp) { Roi roi = imp.getRoi(); int width, height; Rectangle r; if (roi!=null) { r = roi.getBounds(); width = r.width; height = r.height; } else r = new Rectangle(0,0,imp.getWidth(),imp.getHeight()); ImageProcessor ip; ImageStack stack1 = imp.getStack(); ImageStack stack2 = new ImageStack(r.width, r.height); for (int i=1; i<=stack1.getSize(); i++) { ip = stack1.getProcessor(i); ip.setRoi(r); ImageProcessor ip2 = ip.crop(); ip2 = ip2.convertToByte(true); stack2.addSlice(null, ip2); } ImagePlus imp2 = imp.createImagePlus(); imp2.setStack(imp.getTitle()+" (RGB)", stack2); ImageConverter ic = new ImageConverter(imp2); ic.convertRGBStackToRGB(); imp2.show(); } }
|
RGBStackConverter |
|