首先,我不太精通Java。事实上,我正在使用JLink/Mathematica来做我想做的事情。
在我们的实验室里,我们用数学控制的相机拍摄实验的照片。我们想把我们的图像显示程序转换成ImageJ。另一个程序是内存占优势,而且速度很慢。
根据我的研究,我可以通过编写插件、脚本或宏来实现这一点。我也有这样的印象:我写的任何东西都将安装到ImageJ中,并由默认的GUI控制。
我的问题是,我能否编写一个控制已经运行的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[]捕获已经运行的getLog[]的日志。
同样,问题是,我是否可以使用未安装在ImageJ中的外部脚本作为插件、脚本或宏在已经运行的ImageJ上显示映像?或者,我可以使用外部脚本来调用已经运行的ImageJ实例上预装的宏吗?
发布于 2015-10-09 21:08:51
你想要做的事情叫做进程间通信。ImageJ具有将信息传递给正在运行的实例的机制。去编辑▶Options▶Misc..。并选中“运行单个实例侦听器”框。但是,此特性仅限于命令行参数。因此,您可以告诉正在运行的实例打开磁盘中的映像,方法是尝试使用所需的参数启动第二个ImageJ (然后将其传递给正在运行的实例)。但是你不能直接在线路上给它输入像素--你必须把它们写到临时文件中。
您最简单的选择是通过ImageJ完成所有操作。但这并不是从你目前的场景中最容易跳出来的,在混合的数学场景中。
所以,下一件最简单的事情就是从Mathematica启动ImageJ,并始终与相同的ImageJ实例进行通信来完成所有事情。也许你能做到?
如果必须与外部启动的ImageJ实例通信,则需要使用我前面提到的CLI参数传递方案,或者实现某种类型的自己的进程间通信方案。
https://stackoverflow.com/questions/33023534
复制相似问题