package ij.plugin;
import ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import java.awt.image.*;
import ij.plugin.frame.ContrastAdjuster;
/** This plugin implements the Image/Color/Make Composite command. */
public class CompositeConverter implements PlugIn {
public void run(String arg) {
String[] modes = {"Composite", "Color", "Grayscale"};
ImagePlus imp = IJ.getImage();
if (imp.isComposite()) {
CompositeImage ci = (CompositeImage)imp;
if (ci.getMode()!=CompositeImage.COMPOSITE) {
ci.setMode(CompositeImage.COMPOSITE);
ci.updateAndDraw();
}
if (!IJ.isMacro()) IJ.run("Channels Tool...");
return;
}
String mode = modes[0];
int z = imp.getStackSize();
int c = imp.getNChannels();
if (c==1) {
c = z;
imp.setDimensions(c, 1, 1);
if (c>7) mode = modes[2];
}
if (imp.getBitDepth()==24) {
if (z>1)
convertRGBToCompositeStack(imp, arg);
else
convertRGBToCompositeImage(imp);
if (!IJ.isMacro()) IJ.run("Channels Tool...");
} else if (c>=2 || (IJ.macroRunning()&&c>=1)) {
GenericDialog gd = new GenericDialog("Make Composite");
gd.addChoice("Display Mode:", modes, mode);
gd.showDialog();
if (gd.wasCanceled()) return;
int index = gd.getNextChoiceIndex();
CompositeImage ci = new CompositeImage(imp, index+1);
ci.show();
imp.hide();
if (!IJ.isMacro()) IJ.run("Channels Tool...");
} else
IJ.error("To create a composite, the current image must be\n a stack with at least 2 channels or be in RGB format.");
}
void convertRGBToCompositeImage(ImagePlus imp) {
ImageWindow win = imp.getWindow();
Point loc = win!=null?win.getLocation():null;
ImagePlus imp2 = new CompositeImage(imp, CompositeImage.COMPOSITE);
if (loc!=null) ImageWindow.setNextLocation(loc);
imp2.show();
imp.hide();
WindowManager.setCurrentWindow(imp2.getWindow());
}
void convertRGBToCompositeStack(ImagePlus imp, String arg) {
int width = imp.getWidth();
int height = imp.getHeight();
ImageStack stack1 = imp.getStack();
int n = stack1.getSize();
ImageStack stack2 = new ImageStack(width, height);
for (int i=0; i<n; i++) {
ColorProcessor ip = (ColorProcessor)stack1.getProcessor(1);
stack1.deleteSlice(1);
byte[] R = new byte[width*height];
byte[] G = new byte[width*height];
byte[] B = new byte[width*height];
ip.getRGB(R, G, B);
stack2.addSlice(null, R);
stack2.addSlice(null, G);
stack2.addSlice(null, B);
}
n *= 3;
imp.changes = false;
ImageWindow win = imp.getWindow();
Point loc = win!=null?win.getLocation():null;
ImagePlus imp2 = new ImagePlus(imp.getTitle(), stack2);
imp2.setDimensions(3, n/3, 1);
int mode = arg!=null && arg.equals("color")?CompositeImage.COLOR:CompositeImage.COMPOSITE;
imp2 = new CompositeImage(imp2, mode);
if (loc!=null) ImageWindow.setNextLocation(loc);
imp2.show();
imp.changes = false;
imp.close();
}
}