2017-01-13 3 views
2

Я пытался найти способ сделать это онлайн, но я ничего не смог найти.JavaFX GraphicsContext Inverted Circle

Я хочу нарисовать «обратный круг» с помощью JavaFX GraphicsContext. Эти изображения показывают, что я хочу.

Оригинал: original picture

С "Перевернутый Circle" (То, что я хочу сделать): 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 Вероятно, путь Фабиана предпочтительнее, но «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