2016-02-05 15 views
1

我在Java應用程序中,在那裏我看不見的模式下運行的ImageJ使用ImageJ 1.x APIImageJ API:如何訪問java代碼中的直線選擇對象?

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代碼的圖像。因此,顯然,覆蓋圖是找到用戶生成的直線選擇對象實例的錯誤地方。有人知道,如何訪問直線選擇對象?

回答

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); 
+0

這正是我所期待的。坦克你非常!也感謝您參考ImageJ論壇。我沒有意識到這一點。 – croset3