1

首先,我不是很精通Java。事实上,我正在使用 JLink/Mathematica 来做我想做的事情。

在我们的实验室中,我们正在使用 Mathematica 控制的相机为我们的实验拍照。我们想将我们的图像显示程序转换为 ImageJ。另一个程序是一个内存猪,它很慢。

根据我的研究,我可以通过编写插件、脚本或宏来实现这一点。我也觉得我写的任何东西都会安装到 ImageJ 中并由默认的 GUI 控制。

我的问题是,我可以编写一个外部程序来控制已经运行的 ImageJ 实例吗?理想情况下,事件的顺序是。

  1. 相机通过已经存在的脚本捕捉图像。
  2. 图像捕获脚本要求 ImageJ 显示捕获的图像以及默认 GUI,以便我可以访问默认工具集。
  3. 我可以通过默认的 GUI 做一些剖面图和直方图。
  4. 将图像移交给 ImageJ 的脚本已关闭,但 ImageJ 上的图像仍处于打开状态。

我已成功导入 ImageJ 的 ij 类并使用它。这是我在 ImageJ 中创建图片的尝试。它在 Mathematica 的 JLink 中,但可以很好地翻译成 Java。

Needs["JLink`"];
InstallJava[];
AddToClassPath["C:\\Program Files\\ImageJ\\ij.jar"];
ijClass = LoadJavaClass["ij.IJ"];
imagePlusClass = LoadJavaClass["ij.ImagePlus"];
JavaNew[imagePlusClass, "My New Image", 
  JavaNew["ij.process.ByteProcessor", 400, 400]]@show[]
ij`IJ`log["test"];
ij`IJ`getLog[]

然而,创建的图像是在某种 Java 窗口中。已经运行的 imageJ 根本不与它交互。此外,我似乎可以使用 getLog[] 捕获已经运行的 ImageJ 的日志。

同样,问题是,我可以使用 ImageJ 中未安装的外部脚本作为插件、脚本或宏在已经运行的 ImageJ 上显示图像吗?或者,我可以使用外部脚本在已经运行的 ImageJ 实例上调用预安装的宏吗?

4

1 回答 1

0

您正在尝试做的事情称为进程间通信。ImageJ 具有将信息传递给正在运行的实例的机制。转到 Edit ▶ Options ▶ Misc... 并选中“Run single instance listener”框。但是,此功能仅限于命令行参数。因此,您可以告诉正在运行的实例,例如,通过尝试启动具有所需参数的第二个 ImageJ(然后将其传递给正在运行的实例)来从磁盘打开图像。但是你不能直接通过网络给它提供像素——你必须将它们写入一个临时文件。

您最简单的选择是通过 ImageJ 完成所有操作。但这并不是从您当前使用 Mathematica 的场景中最简单的跳跃。

因此,下一个最简单的事情是从 Mathematica 启动 ImageJ,并始终与同一 ImageJ 实例通信以完成所有操作。也许你可以做到这一点?

如果您必须与外部启动的 ImageJ 实例通信,您将需要使用我上面提到的 CLI 参数传递方案,或者实现您自己的某种进程间通信方案。

于 2015-10-09T21:08:51.250 回答