本节内容已经过时,可能具有误导性或无效。请谨慎对待这里的任何说明。如有疑问,请向社区求助。
现在您想知道 ImageJ 如何确定哪些插件可用以及如何调用它们?如果是这样,那么您来对地方了。
ImageJ 插件是什么?
ImageJ 插件是实现 ij.plugin.PlugIn 或 ij.plugin.filter.PlugInFilter 接口的类。晚上仅在具有输入图像时才作业,并且它有一个 setup() 方法,该方法返回有关插件可以处理哪些类型的图像的信息。
如果插件类同时实现 PlugIn 和 PlugInFilter 接口,则首选 PlugIn 接口。
ImageJ 如何找到插件?
插件以 .class 或 .jar 文件形式存储在 ImageJ 根目录的 plugins/ 目录中。
约定是文件名包含下划线。如果文件是.jar文件,则在其内容中搜索名称中包含下划线的.class文件。下划线将替换为空格,生成的名称(不带.class扩展名)将添加到Plugins菜单中。
如果 .jar 文件包含名为 plugins.config 的文件,则 不会 执行 .jar 文件中的 .class 文件。如果该文件存在,则其本身进行解析以获取菜单项的标签和相应的 Java 类。 plugins.config 文件如下所示:
# This is a comment (empty lines are also ignored)
# This line will add "Blob" to the "New" submenu of the "File" menu.
# Clicking on "Blob" will call the plugin class "my.test.Test"
File>New, "Blob", my.test.Test
技术说明:插件通过 ij.io.PluginClassLoader 的实例加载,可通过调用 ij.IJ.getClassLoader() 来获取。
济斐注意:虽然插件的 .jar 文件存储在 plugins/ 目录中,但第三方库却不是。它们存储在 jars/ 目录中,因此例如文件 jai_code 插件c.jar (其中还包含插件名称中标记下划线的类)不会被误认为是 .jar。插件共享位于 jars 目录中的所有第三方库。每个类路径中都有所有第三方库。
插件可以重新加载吗?
是的。通过单击“帮助”菜单中的“更新菜单”,ImageJ 的插件类加载器将被替换为新实例。不过,已经运行的插件不会重新加载。
技术说明:要使类重新加载工作,plugins/目录必须位于类路径中而不是是,支承系统类加载器处理这些类(在这种情况下,它们无法卸载,因此也无法重新加载)。
斐济注意:由于第三方库无法位于plugins/目录中,因此它们必须位于类路径中(否则,PluginClassLoader将无法解析这些类)。
另一个斐济注意事项:为了使脚本语言正常工作,解释器类加载器必须由 ImageJ 的插件类加载器替换或增强。
插件如何指定输入/输出参数?
插件通常在其 run() 方法中实例化 ij.gui.GenericDialog。这个类有三个目的:
- 它显示一个带标记的给定类型的给定参数的对话框,
- 如果有正在运行的宏记录器,并且对话框未取消,则记录键/值(使用对话框的标签作为键),并且
- 如果对话框在宏中的上下文“显示”,则通过相同的键从宏中指定的参数中检索值。
技术说明:如果插件使用推荐的 GenericDialog 方式来请求参数,目前除了运行该方法并查看对话框提供的内容之外,没有其他方法可以精确查找插件提供的参数。换句话说,这种方法仅在 ImageJ 常用桌面应用程序时有用,而当您想将其常用库时则无用。
另一个技术说明:由于GenericDialog扩展了AWT类,因此无法在Linux上以无头模式实例化。原因是文本尺寸(以及对话框本身的尺寸)只能使用X11字体管理器的功能来推断。如果没有图形用户界面,则无法在Linux上的ImageJ中运行参数化宏。
斐济注意:我们有一个解决方法,其中我们有一些类的“替代”实现,它们不再扩展 AWT 类。这些实现位于 misc/headless.jar 中,并且插件在无头模式下调用 Fiji 时添加到类路径前面,以便在 ImageJ 找到这些实现。失败是依赖 AWT 类作为基类的插件将停止工作,但至少有些即使没有图形用户界面也能以这种方式运行。