我在我的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
类的对象(扩展ij.gui.Roi
的类)。我知道要在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()
会返回null
。因此,显然,叠加是查找用户生成的直线选择对象实例的错误位置。有人知道,如何访问直线选择对象?
答案 0 :(得分:3)
有关ImageJ API的问题,通常ImageJ forum是最好的问题。
有人知道如何访问直线选择对象吗?
您走在正确的轨道上,但误导了ij.gui.Overlay
类(可以包含任意数量的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);