ImageJ API:如何在 java 代码中访问直线选择对象?

ImageJ API: how to get access to a straight line selection object in the java code?

我在我的 Java 应用程序中使用 ImageJ 1.x API,其中我 运行 ImageJ 处于不可见模式:

ImageJ imageJApplication = new ImageJ(2);

在我的 Java 应用程序中,我生成了几张图像并打开它们供用户交互:

Opener opener = new Opener();  
String imageFilePath = getLastImageFilePath();
ImagePlus imp = opener.openImage(imageFilePath);
imp.show();

我为用户提供了在任何打开的图像上进行直线选择的可能性:

IJ.setTool(4);

如果用户在图像上画了一条直线,那么我需要得到这条线的长度。为此,我尝试访问由用户交互生成的直线选择对象。不幸的是,我不知道 ImageJ 在哪里创建和保存这个对象。

我假设它应该是 ij.gui.Line class(扩展 ij.gui.Roi 的 class)的对象。我知道要在 java 程序中自己绘制一个 Roi 类型的对象,我会创建一个 ij.gui.Overlay 实例,将 Roi 对象添加到叠加层,然后将叠加层设置为我的 ImagePlus 目标实例。所以我试图在我打开的图像的叠加层中寻找直线选择对象:

ImagePlus imp = WindowManager.getCurrentImage();
double lineLength = 0;

Overlay overlay = imp.getOverlay();
if (overlay!=null){
  for (int i = 0; i < overlay.size(); i++){
    if (overlay.get(i).isLine()){
      Line currentImageLine = (Line) overlay.get(i);
      lineLength = currentImageLine.getLength();
    }
  }
}

但对于用户绘制直线的图像,请在上面的代码中调用 imp.getOverlay() returns null。因此,显然,overlay 是寻找用户生成的直线选择对象实例的错误位置。有人知道如何访问直线选择对象吗?

关于 ImageJ API 的问题,通常 ImageJ forum 是最好的提问地点。

Does somebody know how to get access to the straight line selection object?

你走在正确的轨道上,但被 ij.gui.Overlay class 误导了(它可以包含任意数量的 ij.gui.Roi 对象,但需要明确添加到 ImagePlus).

要从 ImagePlus 中获取 当前选择 ,只需调用 imp.getRoi()(另请参阅 javadoc):

ImagePlus imp = WindowManager.getCurrentImage();
double lineLength = 0;
Roi roi = imp.getRoi();

if (roi != null && roi.isLine()) {
    lineLength = roi.getLength();
}

再多一条评论:

ImageJ imageJApplication = new ImageJ(2);
 ...
IJ.setTool(4);

为了使您的代码更具可读性,请使用定义的常量而不是任意整数:

ImageJ imageJApplication = new ImageJ(ImageJ.NO_SHOW);
 ...
IJ.setTool(Toolbar.LINE);