|
StackEditor |
|
package ij.plugin; import ij.*; import ij.gui.*; import ij.process.*; import ij.measure.Calibration; import ij.macro.Interpreter; import ij.io.FileInfo; /** Implements the AddSlice, DeleteSlice and "Convert Windows to Stack" commands. */ public class StackEditor implements PlugIn { ImagePlus imp; int nSlices, width, height; /** 'arg' must be "add", "delete" or "convert". */ public void run(String arg) { imp = WindowManager.getCurrentImage(); if (imp==null) {IJ.noImage(); return;} nSlices = imp.getStackSize(); width = imp.getWidth(); height = imp.getHeight(); if (arg.equals("tostack")) {convertImagesToStack(); return;} if (arg.equals("add")) {addSlice(); return;} if (nSlices<2) {IJ.error("Stack requred"); return;} if (arg.equals("delete")) deleteSlice(); else if (arg.equals("toimages")) convertStackToImages(imp); } void addSlice() { if (!imp.lock()) return; int id = 0; ImageStack stack = imp.getStack(); if (stack.getSize()==1) { String label = stack.getSliceLabel(1); if (label!=null && label.indexOf("\n")!=-1) stack.setSliceLabel(null, 1); id = imp.getID(); } ImageProcessor ip = imp.getProcessor(); int n = imp.getCurrentSlice(); if (IJ.altKeyDown()) n--; // insert in front of current slice stack.addSlice(null, ip.createProcessor(width, height), n); imp.setStack(null, stack); imp.setSlice(n+1); imp.unlock(); if (id!=0) IJ.selectWindow(id); // prevents macros from failing } void deleteSlice() { if (!imp.lock()) return; ImageStack stack = imp.getStack(); int n = imp.getCurrentSlice(); stack.deleteSlice(n); imp.setStack(null, stack); if (n--<1) n = 1; imp.setSlice(n); imp.unlock(); } public void convertImagesToStack() { int[] wList = WindowManager.getIDList(); if (wList==null) { IJ.error("No images are open."); return; } int count = 0; ImagePlus[] image = new ImagePlus[wList.length]; for (int i=0; i<wList.length; i++) { ImagePlus imp = WindowManager.getImage(wList[i]); if (imp.getStackSize()==1) image[count++] = imp; } if (count<2) { IJ.error("There must be at least two open images."); return; } Calibration cal2 = image[0].getCalibration(); for (int i=0; i<(count-1); i++) { if (image[i].getType()!=image[i+1].getType()) { IJ.error("All open images must be the same type."); return; } if (image[i].getWidth()!=image[i+1].getWidth() || image[i].getHeight()!=image[i+1].getHeight()) { IJ.error("All open images must be the same size."); return; } Calibration cal = image[i].getCalibration(); if (!image[i].getCalibration().equals(cal2)) cal2 = null; } int width = image[0].getWidth(); int height = image[0].getHeight(); double min = Double.MAX_VALUE; double max = -Double.MAX_VALUE; ImageStack stack = new ImageStack(width, height); FileInfo fi = image[0].getOriginalFileInfo(); if (fi!=null && fi.directory==null) fi = null; for (int i=0; i<count; i++) { ImageProcessor ip = image[i].getProcessor(); if (ip.getMin()<min) min = ip.getMin(); if (ip.getMax()>max) max = ip.getMax(); String label = image[i].getTitle(); String info = (String)image[i].getProperty("Info"); if (info!=null) label += "\n" + info; if (fi!=null) { FileInfo fi2 = image[i].getOriginalFileInfo(); if (fi2!=null && !fi.directory.equals(fi2.directory)) fi = null; } stack.addSlice(label, ip); image[i].changes = false; image[i].close(); } ImagePlus imp = new ImagePlus("Stack", stack); if (imp.getType()==ImagePlus.GRAY16 || imp.getType()==ImagePlus.GRAY32) imp.getProcessor().setMinAndMax(min, max); if (cal2!=null) imp.setCalibration(cal2); if (fi!=null) { fi.fileName = ""; fi.nImages = imp.getStackSize(); imp.setFileInfo(fi); } imp.show(); } public void convertStackToImages(ImagePlus imp) { if (!imp.lock()) return; ImageStack stack = imp.getStack(); int size = stack.getSize(); if (size>30 && !IJ.macroRunning()) { boolean ok = IJ.showMessageWithCancel("Convert to Images?", "Are you sure you want to convert this\nstack to " +size+" separate windows?"); if (!ok) {imp.unlock(); return;} } Calibration cal = imp.getCalibration(); CompositeImage cimg = imp instanceof CompositeImage?(CompositeImage)imp:null; for (int i=1; i<=size; i++) { String label = stack.getShortSliceLabel(i); String title = label!=null&&!label.equals("")?label:getTitle(imp, i); ImageProcessor ip = stack.getProcessor(i); if (cimg!=null) ip.setMinAndMax(cimg.getMin(i),cimg.getMax(i)); ImagePlus imp2 = new ImagePlus(title, ip); imp2.setCalibration(cal); imp2.show(); } imp.changes = false; ImageWindow win = imp.getWindow(); if (win!=null) win.close(); else if (Interpreter.isBatchMode()) Interpreter.removeBatchModeImage(imp); imp.unlock(); } String getTitle(ImagePlus imp, int n) { String digits = "00000000"+n; return imp.getShortTitle()+"-"+digits.substring(digits.length()-4,digits.length()); } }
|
StackEditor |
|