2017-01-13 5 views
2

Ich habe versucht, einen Weg zu finden, dies online zu tun, aber ich konnte nichts finden.JavaFX GraphicsContext Inverted Circle

Ich möchte einen "inversen Kreis" mit dem JavaFX GraphicsContext zeichnen. Diese Bilder zeigen, was ich will.

Original: original picture

Mit "Inverted Circle" (Was ich zeichnen wollen): with inverted circle

In einem Bildeditor ich in der neuen Ebene der Kreisfläche nur löschen kann ... I sehe keine Funktionen, die das in GraphicsContext tun würden.

Ich müsste in der Lage sein, den Mittelpunkt und Radius dieses "Kreises" zu wählen.

Danke!

Antwort

1

Ich bin mir nicht sicher, direkt GraphicsContext zu verwenden, aber Sie können es mit Blending tun.

ImageView image; // Your image 
Circle mask = new Circle(); 

Group g = new Group(); 
g.setBlendMode(BlendMode.SRC_ATOP); 
g.getChildren.add(image); 
g.getChildren.add(mask); 
+0

ich diese verwenden würde, aber leider habe ich ein Spiel mache, also verwende ich eine Leinwand – MCMastery

+0

@MCMastery Fabian's Art wird wahrscheinlich bevorzugt, aber 'GraphicsContext' unterstützt [BlendMode] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#setGlobalBlendMode-javafx.scene.effect .BlendMode-) ebenfalls. Wenn Sie nicht in der Lage sind, können Sie einen Blick darauf werfen. – Jai

1

Konstruieren Sie eine Kreisbahn und als Clip verwenden, wenn das Bild zeichnen:

@Override 
public void start(Stage primaryStage) { 
    Image image = new Image("https://i.stack.imgur.com/zEoW1.jpg"); 
    double w = image.getWidth(); 
    double h = image.getHeight(); 

    Canvas canvas = new Canvas(w, h); 
    GraphicsContext gc = canvas.getGraphicsContext2D(); 

    // draw background 
    gc.setFill(Color.BLACK); 
    gc.fillRect(0, 0, w, h); 

    double r = Math.min(h, w) * 2/5; 
    double cx = w/2; 
    double cy = h/2; 

    // create circular path 
    gc.beginPath(); 
    gc.moveTo(cx - r, cy); // to first point on the circle 
    gc.arc(cx, cy, r, r, 180, 360); 
    gc.closePath(); 

    gc.clip(); 

    gc.drawImage(image, 0, 0); 

    StackPane root = new StackPane(); 
    root.getChildren().add(canvas); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

Das sieht richtig aus und scheint so zu sein, als müsste es funktionieren ... Ich werde herausfinden, was ich falsch mache – MCMastery