ImageJ (Java) рисовать графику в верхней части изображения - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу нарисовать круг над изображением в imageJ.На самом деле я открыл виртуальный стек.С помощью следующего кода я вижу, что круг нарисован, когда я вызываю функцию draw_dashed.

  public enum Figures {
    RECTANGLE, OVAL, CIRCLE, POLYGON,
    FREEROI, LINE, POLYLINE, FREELINE, ANGLE
}

/**
 * Draws various dashed patterns with different ROI type selections.
 * Adapted from https://imagej.nih.gov/ij/plugins/dotted-line.html
 * 
 * @param imp   The imagePlus for the image
 * @param width   Width line
 * @param dashvalues   [0] Lengths [1] Space
 * 
 * @return void
*/
public static void draw_dashed(ImagePlus imp, boolean first, double width, float[] dashvalues, double x, double y, double w, double h, Figures figure) {
    if (first){
        imp.killRoi();
        imp.copy(); 
    }else{
        imp.paste();
        imp.killRoi();
    }
    ImageProcessor ip = imp.getProcessor();     
    ip = ip.convertToByteProcessor();//ip.convertToRGB();
    BufferedImage bi = ip.getBufferedImage();
    Graphics2D g2 = (Graphics2D)bi.getGraphics();
    g2.clearRect(0, 0, imp.getWidth(), imp.getHeight() );
    g2.drawImage(imp.getBufferedImage(),0,0, null);
    Color c = Toolbar.getForegroundColor();
    Stroke stroke = new BasicStroke((float)width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, dashvalues, 0);
    g2.setStroke(stroke);
    g2.setColor(c);

    switch (figure) {
       case RECTANGLE:
          Rectangle2D rect = new Rectangle2D.Double(x, y, w, h);
          g2.draw(rect);
          break;
       case OVAL:
          Ellipse2D ellipse = new Ellipse2D.Double(x, y, w, h);
          g2.draw(ellipse);
          break;
       case CIRCLE:
           Ellipse2D circle = new Ellipse2D.Double(x, y, w, h);
           g2.draw(circle);
           break;
    default:
        System.out.println("figure "+figure.name()+" not implemented yet");
        break;
       }
    System.out.println("Before: "+imp.getNFrames()+" s"+imp.getNSlices());
    imp.setImage(bi);        
    System.out.println("After: "+imp.getNFrames()+" s"+imp.getNSlices());
 }

public void somestuff(boolean first) {
    final ImagePlus imp = WindowManager.getCurrentImage();
    float[] temps1 = {3.f, 4.f};                        
    double[] circle_position = {20.,20.}; 
    double circle_size = 5.;
    draw_dashed(imp , first, 1., temps1, circle_position[0], 
                circle_position[1], circle_size, circle_size,Figures.CIRCLE);
}

Я делаю эту штуку, копируя изображение и вставляя его, потому что каждый раз, когда я вызываю функцию,новое изображение переопределяет последний раз, когда оно было изменено, но я хочу переопределить оригинал.С помощью этого кода я вижу, что после вызова функции у меня остается такое же количество кадров, но если я пытаюсь перейти к другому кадру, изображение не обновляется.Это как если бы оно всегда перекрывалось изображением, нарисованным ранее.Что я могу сделать?

...