2014-02-20 50 views
0

我試圖在ImageJ上創建一個插件,在ROI內部創建一個10像素寬的框架。我在做這件事情時遇到了麻煩,到目前爲止,我的代碼只是填充了ROI中10個像素開始的整個空間。我的代碼如下。ImageJ插件在ROI內繪製白色框架

import ij.*; 
import ij.plugin.filter.PlugInFilter; 
import ij.process.*; 
import java.awt.*; 
public class Frame implements PlugInFilter { 

    public int setup(String arg, ImagePlus imp) { 
     if (arg.equals("about")) 
      {showAbout(); return DONE;} 
     return DOES_8G+DOES_STACKS+SUPPORTS_MASKING; 
    } 

    public void run(ImageProcessor ip) { 
     byte[] pixels = (byte[])ip.getPixels(); 
     int width = ip.getWidth(); 
     Rectangle r = ip.getRoi(); 
     int offset, i; 
     for (int y=r.y+10; y<(r.y+r.height)-10; y++) { 
      offset = y*width; 
      for (int x=r.x+10; x<(r.x+r.width)-10; x++) { 
       i = offset + x ; 
       pixels[i] = (byte)(255); 
      } 
     } 
    } 

回答

0

爲什麼你嘗試這種困難(即低級API)的方式?

使用ImageJ的command recorder插件>宏>記錄...和設置 「記載:」 以的Java),可以快速獲得所需的Java代碼之後創建

  • 選擇,
  • 將它添加到ROI manager
  • 運行編輯>選擇>Enlarge...
  • 添加新ROI給管理者,
  • 組合使用XOR,和
  • 填充前景色所得選擇兩個ROI。

的代碼應該是這樣的:

import ij.IJ; 
import ij.ImagePlus; 
import ij.plugin.frame.RoiManager; 

// [...] 

RoiManager rm = RoiManager.getInstance(); 
if (rm==null) rm = new RoiManager(); 
rm.runCommand("Deselect"); 
if (rm.getCount() > 0) rm.runCommand("Delete"); 
ImagePlus imp = IJ.getImage(); 
// imp.setRoi(30, 50, 150, 100); 
rm.addRoi(imp.getRoi()); 
IJ.run(imp, "Enlarge...", "enlarge=-10"); 
rm.addRoi(imp.getRoi()); 
rm.setSelectedIndexes(new int[]{0,1}); 
rm.runCommand("XOR"); 
IJ.run(imp, "Fill", "slice"); 
imp.show(); 
+0

@eglinger我必須做我分配了艱辛的道路 – medellin81391