|
StackWriter |
|
package ij.plugin; import java.awt.*; import java.io.*; import java.text.DecimalFormat; import java.util.*; import ij.*; import ij.io.*; import ij.gui.*; import ij.measure.Calibration; /** Writes the slices of stack as separate files. */ public class StackWriter implements PlugIn { //private static String defaultDirectory = null; private static String[] choices = {"BMP", "FITS", "GIF", "JPEG", "PGM", "PNG", "Raw", "Text", "TIFF", "ZIP"}; private static String fileType = "TIFF"; private static int ndigits = 4; private static int startAt; private static boolean useLabels; //private static boolean startAtZero; public void run(String arg) { ImagePlus imp = WindowManager.getCurrentImage(); if (imp==null || (imp!=null && imp.getStackSize()<2)) { IJ.error("Stack Writer", "This command requires a stack."); return; } int stackSize = imp.getStackSize(); String name = imp.getTitle(); int dotIndex = name.lastIndexOf("."); if (dotIndex>=0) name = name.substring(0, dotIndex); GenericDialog gd = new GenericDialog("Save Image Sequence"); gd.addChoice("Format:", choices, fileType); gd.addStringField("Name:", name, 12); gd.addNumericField("Start At:", startAt, 0); gd.addNumericField("Digits (1-8):", ndigits, 0); gd.addCheckbox("Use Slice Labels as File Names", useLabels); gd.showDialog(); if (gd.wasCanceled()) return; fileType = gd.getNextChoice(); name = gd.getNextString(); startAt = (int)gd.getNextNumber(); if (startAt<0) startAt = 0; ndigits = (int)gd.getNextNumber(); useLabels = gd.getNextBoolean(); int number = 0; if (ndigits<1) ndigits = 1; if (ndigits>8) ndigits = 8; int maxImages = (int)Math.pow(10,ndigits); if (stackSize>maxImages && !useLabels) { IJ.error("Stack Writer", "More than " + ndigits +" digits are required to generate \nunique file names for "+stackSize+" images."); return; } String format = fileType.toLowerCase(Locale.US); if (format.equals("gif") && !FileSaver.okForGif(imp)) return; else if (format.equals("fits") && !FileSaver.okForFits(imp)) return; if (format.equals("text")) format = "text image"; String extension = "." + format; if (format.equals("tiff")) extension = ".tif"; else if (format.equals("text image")) extension = ".txt"; String digits = getDigits(number); SaveDialog sd = new SaveDialog("Save Image Sequence", name+digits+extension, extension); String name2 = sd.getFileName(); if (name2==null) return; String directory = sd.getDirectory(); ImageStack stack = imp.getStack(); ImagePlus imp2 = new ImagePlus(); imp2.setTitle(imp.getTitle()); Calibration cal = imp.getCalibration(); int nSlices = stack.getSize(); String path,label=null; for (int i=1; i<=nSlices; i++) { IJ.showStatus("writing: "+i+"/"+nSlices); IJ.showProgress((double)i/nSlices); imp2.setProcessor(null, stack.getProcessor(i)); String label2 = stack.getSliceLabel(i); if (label2!=null && label2.indexOf("\n")!=-1) imp2.setProperty("Info", label2); else { Properties props = imp2.getProperties(); if (props!=null) props.remove("Info"); } imp2.setCalibration(cal); digits = getDigits(number++); if (useLabels) { label = stack.getShortSliceLabel(i); if (label!=null && label.equals("")) label = null; } if (label==null) path = directory+name+digits+extension; else path = directory+label+extension; WindowManager.setTempCurrentImage(imp2); IJ.saveAs(format, path); } WindowManager.setTempCurrentImage(null); IJ.showStatus(""); IJ.showProgress(1.0); IJ.register(StackWriter.class); } String getDigits(int n) { String digits = "00000000"+(startAt+n); return digits.substring(digits.length()-ndigits); } }
|
StackWriter |
|