2017-01-13 8 views
2

私はこれをオンラインで行う方法を見つけようとしてきましたが、何も見つかりませんでした。JavaFX GraphicsContext Inverted Circle

JavaFX GraphicsContextで「逆円」を描画します。 これらの画像は私が望むものを示しています。

オリジナル: "インバーテッド・サークル"(私が描きたいどのような)でoriginal picture

:私はちょうど新しい層にサークルの領域を消去することができ、画像エディタで with inverted circle

... I GraphicsContextでそれを行う関数は表示されません。

この「円」の中心点と半径を選択できる必要があります。

ありがとうございます!

答えて

1

私はGraphicsContextを直接使用することはよくわかりませんが、Blendingを使用するとできます。

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

私はこれを使用しますが、残念ながら私はゲームを作っていますので、私はキャンバスに – MCMastery

+0

@MCMasteryを使用していますおそらくFabianの方法が好まれますが、 'GraphicsContext'は[BlendMode]をサポートしています(http://docs.oracle.com/javase/8/javafx/api/javafx/scene/canvas/GraphicsContext.html#setGlobalBlendMode-javafx.scene.effect .BlendMode-)も同様です。あなたが解決策から外れているなら、それを見てみることができます。 – Jai

1

円形経路を構築して画像を描画するときにクリップとしてそれを使用する:

@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

これは正しいように見え、うまくいくはずです...私が間違っていることを理解する – MCMastery