|
Resizer |
|
package ij.plugin.filter; import ij.*; import ij.gui.*; import ij.process.*; import ij.measure.*; import ij.util.Tools; import java.awt.*; import java.awt.event.*; import java.util.*; /** This plugin implements ImageJ's Resize command. */ public class Resizer implements PlugInFilter, TextListener, ItemListener { ImagePlus imp; private boolean crop; private static int newWidth; private static int newHeight; private static boolean constrain = true; private static boolean interpolate = true; private Vector fields, checkboxes; private double origWidth, origHeight; private boolean sizeToHeight; public int setup(String arg, ImagePlus imp) { crop = arg.equals("crop"); this.imp = imp; IJ.register(Resizer.class); if (crop) return DOES_ALL+ROI_REQUIRED+NO_CHANGES; else return DOES_ALL+NO_CHANGES; } public void run(ImageProcessor ip) { Roi roi = imp.getRoi(); if (roi!=null && roi.isLine()) { IJ.error("The Crop and Adjust->Size commands\ndo not work with line selections."); return; } Rectangle r = ip.getRoi(); origWidth = r.width;; origHeight = r.height; sizeToHeight=false; boolean restoreRoi = crop && roi!=null && roi.getType()!=Roi.RECTANGLE; if (roi!=null && IJ.isJava2()) { Rectangle b = roi.getBounds(); int w = ip.getWidth(); int h = ip.getHeight(); if (b.x<0 || b.y<0 || b.x+b.width>w || b.y+b.height>h) { ShapeRoi shape1 = new ShapeRoi(roi); ShapeRoi shape2 = new ShapeRoi(new Roi(0, 0, w, h)); roi = shape2.and(shape1); if (restoreRoi) imp.setRoi(roi); } } if (crop) { Rectangle bounds = roi.getBounds(); newWidth = bounds.width; newHeight = bounds.height; interpolate = false; } else { if (newWidth==0 || newHeight==0) { newWidth = (int)origWidth/2; newHeight = (int)origHeight/2; } if (constrain) newHeight = (int)(newWidth*(origHeight/origWidth)); GenericDialog gd = new GenericDialog("Resize", IJ.getInstance()); gd.addNumericField("Width (pixels):", newWidth, 0); gd.addNumericField("Height (pixels):", newHeight, 0); gd.addCheckbox("Constrain Aspect Ratio", constrain); gd.addCheckbox("Interpolate", interpolate); gd.addMessage("NOTE: Undo is not available"); fields = gd.getNumericFields(); for (int i=0; i<fields.size(); i++) ((TextField)fields.elementAt(i)).addTextListener(this); checkboxes = gd.getCheckboxes(); ((Checkbox)checkboxes.elementAt(0)).addItemListener(this); gd.showDialog(); if (gd.wasCanceled()) return; newWidth = (int)gd.getNextNumber(); newHeight = (int)gd.getNextNumber(); if (gd.invalidNumber()) { IJ.error("Width or height are invalid."); return; } constrain = gd.getNextBoolean(); interpolate = gd.getNextBoolean(); if (constrain && newWidth==0) sizeToHeight = true; if (newWidth<=0.0 && !constrain) newWidth = 50; if (newHeight<=0.0) newHeight = 50; } if (!crop && constrain) { if (sizeToHeight) newWidth = (int)(newHeight*(origWidth/origHeight)); else newHeight = (int)(newWidth*(origHeight/origWidth)); } if (ip.getWidth()==1 || ip.getHeight()==1) ip.setInterpolate(false); else ip.setInterpolate(interpolate); int nSlices = imp.getStackSize(); try { StackProcessor sp = new StackProcessor(imp.getStack(), ip); ImageStack s2 = sp.resize(newWidth, newHeight); int newSize = s2.getSize(); if (s2.getWidth()>0 && newSize>0) { if (restoreRoi) imp.killRoi(); //imp.hide(); Calibration cal = imp.getCalibration(); if (cal.scaled()) { cal.pixelWidth *= origWidth/newWidth; cal.pixelHeight *= origHeight/newHeight; imp.setCalibration(cal); } imp.setStack(null, s2); //imp.show(); if (restoreRoi) { imp.restoreRoi(); roi = imp.getRoi(); if (roi!=null) { roi.setLocation(0, 0); imp.draw(); } } } if (nSlices>1 && newSize<nSlices) IJ.error("ImageJ ran out of memory causing \nthe last "+(nSlices-newSize)+" slices to be lost."); } catch(OutOfMemoryError o) { IJ.outOfMemory("Resize"); } } public void textValueChanged(TextEvent e) { TextField widthField = (TextField)fields.elementAt(0); TextField heightField = (TextField)fields.elementAt(1); int width = (int)Tools.parseDouble(widthField.getText(),-99); int height = (int)Tools.parseDouble(heightField.getText(),-99); if (width==-99 || height==-99) return; if (constrain) { if (width!=newWidth) { sizeToHeight = false; newWidth = width; updateFields(); } else if (height!=newHeight) { sizeToHeight = true; newHeight = height; updateFields(); } } } void updateFields() { if (sizeToHeight) { newWidth = (int)(newHeight*(origWidth/origHeight)); TextField widthField = (TextField)fields.elementAt(0); widthField.setText(""+newWidth); } else { newHeight = (int)(newWidth*(origHeight/origWidth)); TextField heightField = (TextField)fields.elementAt(1); heightField.setText(""+newHeight); } } public void itemStateChanged(ItemEvent e) { Checkbox cb = (Checkbox)checkboxes.elementAt(0); boolean newConstrain = cb.getState(); if (newConstrain && newConstrain!=constrain) updateFields(); constrain = newConstrain; } }
|
Resizer |
|