ImageJ对于一个桌面应用程序,一个用户在连接到一台计算机的一个屏幕之前。
然而,它获得了macro功能,针对此类宏的batch mode,甚至scripting支持。
自然地,用户希望在没有可用的图形用户界面的环境(例如集群)中执行此类macros或scripts。
--headless模式
为了满足所有这些需求,ImageJ2提供了在无头模式下执行ImageJ插件、宏和脚本的功能。此功能使用补码操作来修复ImageJ在运行时的行为,从而可以在批处理模式下启动ImageJ,从而消耗实例化GUI组件。
缺点:有些插件比 GUI 更受约束 ImageJ 是。当然,这些插件仍然会尝试实例化 GUI 在无头模式下调用元素时失败。
在无头模式下运行脚本
在无头模式下运行宏
要通过命令提示符在无头模式下运行宏,请首先在Fiji安装所在的目录中打开命令提示符。然后使用以下语法以及-macro命令行参数和--headless选项,如下图:
./fiji --headless -macro path-to-Macro.ijm
如果省略 --headless 标志,GUI 将打开并且宏将被执行。
如果宏ImageJ的宏目录中,则可以指定宏名称而不是实际的文件路径。强烈建议使用文件扩展名,但为了兼容,仅定位指定宏名称而不是实际的文件路径时,并不严格要求使用文件扩展名。
您甚至可以将参数提交给宏;例如:
./fiji --headless -macro ./RunBatch.ijm 'folder=../folder1 parameters=a.properties output=../samples/Output'
在这种情况下,RunBatch.ijm 文件应如下:
arg = getArgument()
print("Running batch analysis with arguments:")
print(arg)
run("Batch process", arg )
print("Done.")
eval("script", "System.exit(0);");
getArgument()用于获取参数字符串本身,然后将其传递给IJ命令。
Please note that you will not be able to use script parameters with -macro. Follow instructions in Scripting Headless instead.
一些依赖 GUI 的命令在无头模式下运行,例如:
selectWindow("name"),使用selectImage(title)替换图像Table.Rename("oldTitle", "newTitle")
##为什么需要--headless?
Java 确实通过 java.awt.headless 属性支持无头模式;以上属性设置为 true 即可启用它。
不幸的是,对于基于 X11 的 Java(例如 Linux,这是运行负载最流行的平台),无头模式不允许实例化任何想要显示文本的 GUI 组件。原因是 X11 上的字体目前是由 X11 服务器提供的(并且服务器之间确实有所不同),因此如果没有图形桌面,则根本无法这些元素的尺寸。
由于 ImageJ 被设计为桌面应用程序,因此一切(包括宏)都可以通过 GUI 运行。例如,简单的 run("Open..."); 将在菜单中查找操作。
在 macOS 上,没有问题:Aqua 提供独立于 GUI 的文本渲染(使用抗锯齿映射到实际显示)。其中,以无头模式运行允许实例化 GUI 元素,例如菜单栏。
其他解决方案
Xvfb虚拟桌面
另一种方法是使用虚拟桌面,例如Xvfb。这将允许 ImageJ 以虚拟化图形桌面启动。
优点:不需要运行时修复。
缺点:由于启动GUI的开销,它配置比需要的速度要慢,比较困难,而且插件可能会因为等待永远不会出现的用户输入而卡住。
示例
这里有几个简单的例子。
提交直接参数:
$ cat hello.js
importClass(Packages.ij.IJ);
IJ.log("hello " + arguments[0]);
$ xvfb-run -a $FIJI_DIR/fiji hello.js Emerson
hello Emerson
$ cat hello-with-params.js
// @String name
importClass(Packages.ij.IJ);
IJ.log("hello " + name);
$ xvfb-run -a $FIJI_DIR/fiji --ij2 --headless --run hello-with-params.js 'name="Emerson"'
hello Emerson
一个更复杂的 shell 脚本,封装了与 Xvfb 一起使用的宏(感谢 Nestor Milyaev):
export DISPLAY=:1
Xvfb $DISPLAY -auth /dev/null &
(
# the '(' starts a new sub shell. In this sub shell we start the worker processes:
script=$scriptDir"lsmrotate2nrrd.ijm \"dir="$1"&angle-x=$2&angle-y=
$3&angle-z=$4&reverse=$5\" -batch"
$imagejBin -macro $script # running the actual ijm script
wait # waits until all 'program' processes are finished
# this wait sees only the 'program' processes, not the Xvfb process
)
另请参阅this post on the ImageJ mailing list。
重写为脚本或插件
最可靠的方法完全可以用 GUI 交互的脚本来替换宏。不幸的是,这也是最复杂的解决方案,因为转换宏通常需要一些时间。