| RGBStackSplitter |

    package ij.plugin.filter;
    import ij.*;
    import ij.process.*;
    import ij.gui.*;
    import ij.measure.Calibration;
    import java.awt.*;

    /** Splits an RGB image or stack into three 8-bit grayscale images or stacks. */
    public class RGBStackSplitter implements PlugInFilter {
        ImagePlus imp;
        /** These are the three stacks created by the split(ImageStack) method. */
        public ImageStack red, green, blue;

        public int setup(String arg, ImagePlus imp) {
            this.imp = imp;
            return DOES_RGB+NO_UNDO;
        }

        public void run(ImageProcessor ip) {
            split(imp);
        }

        /** Splits the specified RGB image or stack into three 8-bit grayscale images or stacks. */
        public void split(ImagePlus imp) {
            boolean keepSource = IJ.altKeyDown();
            String title = imp.getTitle();
            Calibration cal = imp.getCalibration();
            split(imp.getStack(), keepSource);
            if (!keepSource)
                {imp.unlock(); imp.close();}
            ImagePlus rImp = new ImagePlus(title+" (red)",red);
            rImp.setCalibration(cal);
            rImp.show();
            if (IJ.isMacOSX()) IJ.wait(500);
            ImagePlus gImp = new ImagePlus(title+" (green)",green);
            gImp.setCalibration(cal);
            gImp.show();
            if (IJ.isMacOSX()) IJ.wait(500);
            ImagePlus bImp = new ImagePlus(title+" (blue)",blue);
            bImp.setCalibration(cal);
            bImp.show();
        }

        /** Splits the specified RGB stack into three 8-bit grayscale stacks.
            Deletes the source stack if keepSource is false. */
        public void split(ImageStack rgb, boolean keepSource) {
             int w = rgb.getWidth();
             int h = rgb.getHeight();
             red = new ImageStack(w,h);
             green = new ImageStack(w,h);
             blue = new ImageStack(w,h);
             byte[] r,g,b;
             ColorProcessor cp;
             int slice = 1;
             int inc = keepSource?1:0;
             int n = rgb.getSize();
             for (int i=1; i<=n; i++) {
                 IJ.showStatus(i+"/"+n);
                 r = new byte[w*h];
                 g = new byte[w*h];
                 b = new byte[w*h];
                 cp = (ColorProcessor)rgb.getProcessor(slice);
                 slice += inc;
                 cp.getRGB(r,g,b);
                 if (!keepSource)
                    rgb.deleteSlice(1);
                 red.addSlice(null,r);
                 green.addSlice(null,g);
                 blue.addSlice(null,b);
                 IJ.showProgress((double)i/n);
            }
        }

    }

| RGBStackSplitter |