Pegar imagem limitada por Retângulo em JavaFX

Galeris, to tentando pegar um pedaço da imagem de um ImageView usando um Retangulo com bordas e setFill(null) para limitar a parte que eu quero.

DE:

PARA:

CÓDIGO:

Rectangle retangulo = new Rectangle(200, 200);
ImageView background = new ImageView("/bg.jpg");
Pane painel = new Pane(background, retangulo);

@Override
public void start(Stage primaryStage) throws Exception {
    retangulo.setFill(null);
    retangulo.setStroke(Color.WHITE);
    retangulo.setStrokeWidth(5);
    retangulo.setTranslateX(70);
    retangulo.setTranslateY(20);

    Image imageFinal = pscr(painel);

    painel.setPrefSize(600, 600);
    painel.getChildren().add(new ImageView(imageFinal));

    primaryStage.setScene(new Scene(painel));
    primaryStage.show();
}

public Image pscr(Node node) {
    SnapshotParameters param = new SnapshotParameters();
    WritableImage snapshot = node.snapshot(param, null);
    BufferedImage tempImg = SwingFXUtils.fromFXImage(snapshot, null);

    return new Image();
}

Valeu! :slight_smile:

Como não sei o objetivo, então seria mais ou menos:

Image image = background.getImage();
PixelReader pixelReader = image.getPixelReader();
WritableImage snapshot = new WritableImage(pixelReader, (int)retangulo.getX(), (int)retangulo.getY(), (int)retangulo.getWidth(), (int)retangulo.getHeight());
// BufferedImage tempImg = SwingFXUtils.fromFXImage(snapshot, null);

mas se quiser atualizar o background, adicione background.setImage(snapshot);

1 curtida

Resumidamente eu to tentando colocar um imagem em um ImageView através de outro ImageView mas só pegando um pedaço, que estará limitado pelo retângulo, a parte inteira desse Shape. Tudo isso em tempo-real, na execução
Tem como me ajudar?

Image image = background.getImage();
PixelReader pixelReader = image.getPixelReader();
WritableImage snapshot = new WritableImage(pixelReader, (int)retangulo.getX(), (int)retangulo.getY(), (int)retangulo.getWidth(), (int)retangulo.getHeight());
outroImageView.setImage(snapshot);

Vc poderia usar o viewport também:

outroImageView.setImage(background.getImage());
Rectangle2D viewport = new Rectangle2D(retangulo.getX(), retangulo.getY(), retangulo.getWidth(),retangulo.getHeight());
outroImageView.setViewport(viewport);

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/image/ImageView.html

1 curtida