【问题标题】:How to convert node to image in javafx 2.1?如何在 javafx 2.1 中将节点转换为图像?
【发布时间】:2012-09-02 01:58:00
【问题描述】:

我正在使用 Java FX,我想将节点转换为图像。我找到了这个资源,但它并没有解决我的问题,因为我想将节点转换为图像,而不是整个场景。

How to output the content of a Scene graph in JavaFx 2.0 to an Image

【问题讨论】:

  • 我对此了解不多,也没有时间测试,但是您不能创建一个新场景并将要转换为图像的节点添加到其中唯一的孩子,然后使用链接中解释的方法?我猜你永远不必展示你创建的第二个场景。

标签: javafx javafx-2


【解决方案1】:

您可以使用新的 FX 2.2 快照功能:

public class TrySnapshot extends Application {

    @Override
    public void start(Stage primaryStage) {
        final VBox vbox = new VBox(2);
        final Button btn = new Button();
        vbox.getChildren().add(btn);
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                // here we make image from vbox and add it to scene, can be repeated :)
                WritableImage snapshot = vbox.snapshot(new SnapshotParameters(), null);

                vbox.getChildren().add(new ImageView(snapshot));
                System.out.println(vbox.getChildren().size());
            }
        });

        Scene scene = new Scene(new Group(vbox), 300, 250);

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

如果您出于某种原因必须使用较旧的 FX,只需在您链接的代码示例中使用 Node#getBoundsInParent 调用将场景坐标更改为您的节点坐标。

【讨论】:

  • 谢谢谢尔盖。但是 snaphot() 方法不能解决我的问题。我想要一些缓冲图像。
  • 您可以使用 Sergey 的解决方案和SwingFXUtils
【解决方案2】:

这是我的问题的解决方案。这个解决方案是 Sergey 和 Jewelsea 的帮助。此解决方案在 javafx 2.2 中。感谢 Sergey 和 Jewelsea。

public class TrySnapshot extends Application {

javafx.embed.swing.SwingFXUtils fXUtils;
BufferedImage bufferedImage = new BufferedImage(550, 400, BufferedImage.TYPE_INT_ARGB);
File file = new File("C:/Users/PC1/Desktop/Sample Images/test.jpg");
VBox vbox = null;

@Override
public void start(Stage primaryStage) {
    vbox = new VBox();
    Button btn = new Button();
    Image i = new Image("file:C:\\Koala.jpg");
    ImageView imageView = new ImageView();
    imageView.setImage(i);
    vbox.getChildren().add(imageView);
    vbox.setSpacing(10);
    btn.setText("Say 'Hello World'");
    btn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
        // here we make image from vbox and add it to scene, can be repeated :)
       WritableImage snapshot = vbox.snapshot(new SnapshotParameters(), null);
           vbox.getChildren().add(new ImageView(snapshot));
            saveImage(snapshot);
            System.out.println(vbox.getChildren().size());
        }
    });


    Scene scene = new Scene(new Group(btn), 500, 400);

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

private void saveImage(WritableImage snapshot) {
    BufferedImage image;
    image = javafx.embed.swing.SwingFXUtils.fromFXImage(snapshot, bufferedImage);
    try {
        Graphics2D gd = (Graphics2D) image.getGraphics();
        gd.translate(vbox.getWidth(), vbox.getHeight());
        ImageIO.write(image, "png", file);
    } catch (IOException ex) {
        Logger.getLogger(TrySnapshot.class.getName()).log(Level.SEVERE, null, ex);
    };
  }
 }

【讨论】:

    【解决方案3】:

    我有一个类似的问题,我想将一个从 mousevent 给定的节点转换为图像。

    这个非常适合我:

    Image image = ((ImageView) node).getImage();
    

    【讨论】:

      猜你喜欢
      • 2015-05-03
      • 2012-09-17
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2022-01-24
      相关资源
      最近更新 更多