General:
Is there way to do an action/Macro/etc. every time an image is opened, automatically? I would please like to know the actual answer to my question, as it applies to many other situations also. Other workarounds for this specific situation may be helpful, and would be appreciated, but would not address the issue in general. Therefore, my specific problem is listed below. I appreciate any and all help. - Scott Williams, PhD - Specific: I have 2048x2048 16-bit grayscale scale images. ImageJ automatically sets Min and Max display values to the smallest and largest value in the file, respectively, which are often NOT 0 and 65535. I can manually set these values through Balance and Contrast (B&C)>[Set], or use setMinAndMax() in a macro to do the same. But any time I go to B&C, the [Reset] button goes back to these values. I do not want this "option". Additionally, this default value range actually PROHIBITS the manual drawing of any value higher than the largest in the file. Even if I set the Pencil to 255,255,255, it does not draw an actual white of 65565. My current workaround is to draw a single Black pixel in the upper left, and a single White pixel in the lower right, through a macro with: setPixel (0,0,0) setPixel (2047,2047,65535) This will ensure that B&C [Reset] never shows lower than the full 16-bit range. Also, it will ensure that that I can manually draw true White. I would like a way for this simple macro to apply, automatically, each and every time I open an image. Long-term, I might suggest: - adding a [Full] button to the B&C pop-up menu - relabeling the [Reset] button as something more appropriate, perhaps [Range], and - making the "auto-[Range]-on-Open" a Option somewhere which could be enabled/disabled. |
Hi Scott,
Here is a very simple plugin that registers as an ImageListener. You can call it in your StartupMacros.txt. import ij.*;import ij.plugin.*; public class Always_Open_16bit_Fullscale implements PlugIn, ImageListener { public void run(String arg) { ImagePlus.addImageListener(this); } public void imageOpened(ImagePlus imp) { //if it does not work, add this: IJ.wait(100); if (imp.getType()==ImagePlus.GRAY16) imp.setDisplayRange(0, 65535); imp.updateAndDraw(); } public void imageClosed(ImagePlus imp){} public void imageUpdated(ImagePlus imp){} } You should call it only once; otherwise you should add some 'singleton' code. Concerning drawing: if you only want to draw points, you could also create your own drawing macro tool that uses the setPixel(x, y, value) command to draw with a fixed value rather than a color that depends on the display range. Drawing 1-pixel-wide lines would be also possible, but slightly more complex code. Michael ________________________________________________________________ On 19 May 2010, at 17:06, SHW wrote: > General: > Is there way to do an action/Macro/etc. every time an image is opened, > automatically? > > I would please like to know the actual answer to my question, as it > applies > to many other situations also. Other workarounds for this specific > situation may be helpful, and would be appreciated, but would not > address > the issue in general. Therefore, my specific problem is listed below. > > I appreciate any and all help. > - Scott Williams, PhD - > > > Specific: > I have 2048x2048 16-bit grayscale scale images. ImageJ > automatically sets > Min and Max display values to the smallest and largest value in the > file, > respectively, which are often NOT 0 and 65535. I can manually set > these > values through Balance and Contrast (B&C)>[Set], or use setMinAndMax > () in a > macro to do the same. But any time I go to B&C, the [Reset] button > goes > back to these values. I do not want this "option". > Additionally, this default value range actually PROHIBITS the > manual drawing > of any value higher than the largest in the file. Even if I set > the Pencil > to 255,255,255, it does not draw an actual white of 65565. > > My current workaround is to draw a single Black pixel in the upper > left, and > a single White pixel in the lower right, through a macro with: > setPixel (0,0,0) > setPixel (2047,2047,65535) > > This will ensure that B&C [Reset] never shows lower than the full > 16-bit > range. Also, it will ensure that that I can manually draw true White. > > I would like a way for this simple macro to apply, automatically, > each and > every time I open an image. > > > Long-term, I might suggest: > - adding a [Full] button to the B&C pop-up menu > - relabeling the [Reset] button as something more appropriate, > perhaps > [Range], and > - making the "auto-[Range]-on-Open" a Option somewhere which could be > enabled/disabled. |
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1 Hi, I wrote one as well. It allows to configure a macro and the event. Here is the source. I'll put it for download on our website tomorrow. Best regards, Volker Baecker /** * This plugin is in the public domain. * Author: Volker Baecker (volker.baecker at mri.cnrs.fr) */ import java.util.HashSet; import java.util.Set; import ij.IJ; import ij.ImageListener; import ij.ImagePlus; import ij.gui.GenericDialog; import ij.plugin.PlugIn; /** * Run a macro-file from ImageJ's macros folder, each time a selected image-event * is sent. * * @author Volker Baecker * */ public class RunMacroOnEvent_ implements ImageListener, PlugIn { private GenericDialog dialog; private String macroFile; private String event; static public Set<RunMacroOnEvent_> instances = new HashSet<RunMacroOnEvent_>(); @Override public void imageClosed(ImagePlus imp) { if (event.equals("closed")) IJ.runMacroFile(macroFile); } @Override public void imageOpened(ImagePlus imp) { if (event.equals("opened")) IJ.runMacroFile(macroFile); } @Override public void imageUpdated(ImagePlus imp) { if (event.equals("updated")) IJ.runMacroFile(macroFile); } @Override public void run(String arg) { for (RunMacroOnEvent_ instance : instances) ImagePlus.removeImageListener(instance); instances.clear(); this.showDialog(); macroFile = dialog.getNextString(); event = dialog.getNextChoice(); if (event.equals("none")) return; ImagePlus.addImageListener(this); instances.add(this); } private void showDialog() { dialog = new GenericDialog("Run Macro On Event"); dialog.addStringField("macro", "ShowImageInfo.txt"); String[] events = {"opened", "closed", "updated", "none"}; dialog.addChoice("event", events, events[0]); dialog.showDialog(); } } On 19/05/10 18:37, Michael Schmid wrote: > Hi Scott, > > Here is a very simple plugin that registers as an ImageListener. You can > call it in your StartupMacros.txt. > > > import ij.*;import ij.plugin.*; > > public class Always_Open_16bit_Fullscale implements PlugIn, ImageListener { > public void run(String arg) { > ImagePlus.addImageListener(this); > } > > public void imageOpened(ImagePlus imp) { > //if it does not work, add this: IJ.wait(100); > if (imp.getType()==ImagePlus.GRAY16) imp.setDisplayRange(0, 65535); > imp.updateAndDraw(); > } > public void imageClosed(ImagePlus imp){} > public void imageUpdated(ImagePlus imp){} > } > > You should call it only once; otherwise you should add some 'singleton' > code. > > > Concerning drawing: if you only want to draw points, you could also > create your own drawing macro tool that uses the setPixel(x, y, value) > command to draw with a fixed value rather than a color that depends on > the display range. Drawing 1-pixel-wide lines would be also possible, > but slightly more complex code. > > Michael > ________________________________________________________________ > > On 19 May 2010, at 17:06, SHW wrote: > >> General: >> Is there way to do an action/Macro/etc. every time an image is opened, >> automatically? >> >> I would please like to know the actual answer to my question, as it >> applies >> to many other situations also. Other workarounds for this specific >> situation may be helpful, and would be appreciated, but would not address >> the issue in general. Therefore, my specific problem is listed below. >> >> I appreciate any and all help. >> - Scott Williams, PhD - >> >> >> Specific: >> I have 2048x2048 16-bit grayscale scale images. ImageJ automatically >> sets >> Min and Max display values to the smallest and largest value in the file, >> respectively, which are often NOT 0 and 65535. I can manually set these >> values through Balance and Contrast (B&C)>[Set], or use setMinAndMax() >> in a >> macro to do the same. But any time I go to B&C, the [Reset] button goes >> back to these values. I do not want this "option". >> Additionally, this default value range actually PROHIBITS the manual >> drawing >> of any value higher than the largest in the file. Even if I set the >> Pencil >> to 255,255,255, it does not draw an actual white of 65565. >> >> My current workaround is to draw a single Black pixel in the upper >> left, and >> a single White pixel in the lower right, through a macro with: >> setPixel (0,0,0) >> setPixel (2047,2047,65535) >> >> This will ensure that B&C [Reset] never shows lower than the full 16-bit >> range. Also, it will ensure that that I can manually draw true White. >> >> I would like a way for this simple macro to apply, automatically, each >> and >> every time I open an image. >> >> >> Long-term, I might suggest: >> - adding a [Full] button to the B&C pop-up menu >> - relabeling the [Reset] button as something more appropriate, perhaps >> [Range], and >> - making the "auto-[Range]-on-Open" a Option somewhere which could be >> enabled/disabled. > Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAkv0GFwACgkQ0gXPLVKexCcixACfW6RXzk37eMXaJumnCTcQLqfk cIQAn2bF2BatPtz3jNGxl6YKZYG+6U7a =0yHR -----END PGP SIGNATURE----- -- passerelle antivirus du campus CNRS de Montpellier -- |
In reply to this post by SHW
Hi,
On Wed, 19 May 2010, SHW wrote: > Is there way to do an action/Macro/etc. every time an image is opened, > automatically? You do not need to write Java, Javascript is plenty enough (if you are on Java6, or use Fiji). We actually have a very nice example since quite some time on our Wiki: http://pacific.mpi-cbg.de/wiki/index.php/Javascript#Interfaces_and_anonymous_classes And you can call that from a macro using the eval("script", javascript) function: http://rsb.info.nih.gov/ij/developer/macro/functions.html#eval Ciao, Johannes |
Free forum by Nabble | Edit this page |