/* Copyright Albert Cardona @ 2006 * General Public License applies. * Use at your own risk. */ import ij.*; import ij.gui.*; import ij.plugin.PlugIn; import java.awt.Rectangle; import java.awt.Dimension; import java.awt.Toolkit; import java.lang.reflect.Field; public class Zoom_Exact implements PlugIn { public void run(String arg) { ImagePlus imp = WindowManager.getCurrentImage(); if (null == imp) return; ImageWindow win = imp.getWindow(); if (null == win) return; ImageCanvas c = win.getCanvas(); if (null == c) return; GenericDialog gd = new GenericDialog(" Exact Zoom"); gd.addNumericField("Zoom (%): ", c.getMagnification() * 100, 0); gd.showDialog(); if (gd.wasCanceled()) return; double mag = gd.getNextNumber() / 100.0; if (mag <= 0.0) mag = 1.0; win.getCanvas().setMagnification(mag); // see if it fits double w = imp.getWidth() * mag; double h = imp.getHeight() * mag; Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle r = win.getBounds(); if (w > screen.width - 10) w = screen.width - 10; if (h > screen.height - 30) h = screen.height - 30; try { Field f_srcRect = c.getClass().getDeclaredField("srcRect"); f_srcRect.setAccessible(true); f_srcRect.set(c, new Rectangle(0, 0, (int)(w/mag), (int)(h/mag))); c.setDrawingSize((int)w, (int)h); win.pack(); c.repaint(); } catch (Exception e) { e.printStackTrace(); } } }