|
Duplicater |
|
package ij.plugin.filter; import java.awt.*; import ij.*; import ij.process.*; import ij.gui.*; /** This plugin implements ImageJ's Image/Duplicate command. */ public class Duplicater implements PlugInFilter { ImagePlus imp; static boolean duplicateStack; public int setup(String arg, ImagePlus imp) { this.imp = imp; IJ.register(Duplicater.class); return DOES_ALL+NO_CHANGES; } public void run(ImageProcessor ip) { duplicate(imp); } public void duplicate(ImagePlus imp) { int stackSize = imp.getStackSize(); String title = imp.getTitle(); String newTitle = WindowManager.getUniqueName(title); if (!IJ.altKeyDown()||stackSize>1) newTitle = getString("Duplicate...", "Title: ", newTitle); if (newTitle==null) return; ImagePlus imp2; if (duplicateStack) imp2 = duplicateStack(imp, newTitle); else { ImageProcessor ip2 = imp.getProcessor().crop(); imp2 = imp.createImagePlus(); imp2.setProcessor(newTitle, ip2); String info = (String)imp.getProperty("Info"); if (info!=null) imp2.setProperty("Info", info); if (stackSize>1) { ImageStack stack = imp.getStack(); String label = stack.getSliceLabel(imp.getCurrentSlice()); if (label!=null && label.indexOf('\n')>0) imp2.setProperty("Info", label); } } //imp.killRoi(); imp2.show(); } public ImagePlus duplicateStack(ImagePlus imp, String newTitle) { Rectangle rect = null; Roi roi = imp.getRoi(); if (roi!=null && roi.isArea()) rect = roi.getBounds(); int width = rect!=null?rect.width:imp.getWidth(); int height = rect!=null?rect.height:imp.getHeight(); ImageStack stack = imp.getStack(); ImageStack stack2 = new ImageStack(width, height, imp.getProcessor().getColorModel()); for (int i=1; i<=stack.getSize(); i++) { ImageProcessor ip2 = stack.getProcessor(i); ip2.setRoi(rect); ip2 = ip2.crop(); stack2.addSlice(stack.getSliceLabel(i), ip2); } ImagePlus imp2 = imp.createImagePlus(); imp2.setStack(newTitle, stack2); int[] dim = imp.getDimensions(); imp2.setDimensions(dim[2], dim[3], dim[4]); return imp2; } String getString(String title, String prompt, String defaultString) { Frame win = imp.getWindow(); int stackSize = imp.getStackSize(); if (win==null) win = IJ.getInstance(); GenericDialog gd = new GenericDialog(title, win); gd.addStringField(prompt, defaultString, 20); if (stackSize>1) gd.addCheckbox("Duplicate Entire Stack", duplicateStack); else duplicateStack = false; gd.showDialog(); if (gd.wasCanceled()) return null; title = gd.getNextString(); if (stackSize>1) duplicateStack = gd.getNextBoolean(); return title; } }
|
Duplicater |
|