BufferedImage to JavaFX image

Nan*_*nor 22 java javafx

我有一个从主监视器截取的图像,我想将它添加到Java FX中,ImageView如下所示:

@FXML
protected ImageView screenshot() throws AWTException, IOException {
    Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    BufferedImage capture = new Robot().createScreenCapture(screenRect);
    ImageView imageView = new ImageView();
    Image image = capture; //Error
    imageView.setImage(image);
    return imageView;
}
Run Code Online (Sandbox Code Playgroud)

我试图设置BufferedImage capturejavafx.scene.image.Image image但但类型不兼容,我也无法投射它.我怎么能纠正这个?

Rei*_*eus 46

您可以使用

Image image = SwingFXUtils.toFXImage(capture, null);
Run Code Online (Sandbox Code Playgroud)

  • 你能评论一下这个解决方案的性能吗?有没有办法直接创建`javafx.scene.image.Image`而不首先创建`BufferedImage`? (4认同)
  • 当我到达这里时,我也有同样的问题。我查看了 SwingFXUtils 的实现,发现如果创建 JavaFX WritableImage 确实是可能的。在这种情况下,您可以获取其 PixelWriter 并将数据缓冲区写入图像。这非常快,并且与使用 BufferedImage 所做的类似。我从中得到了很好的表现。 (2认同)

小智 9

通常最好的选择是Image image = SwingFXUtils.toFXImage(capture, null);java9 或更大的版本......但是就 javafx 的性能而言,以及在性能较低的设备中,您可以使用这种技术来发挥魔力,在 java8 中进行了测试

private static Image convertToFxImage(BufferedImage image) {
    WritableImage wr = null;
    if (image != null) {
        wr = new WritableImage(image.getWidth(), image.getHeight());
        PixelWriter pw = wr.getPixelWriter();
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                pw.setArgb(x, y, image.getRGB(x, y));
            }
        }
    }

    return new ImageView(wr).getImage();
}
Run Code Online (Sandbox Code Playgroud)

  • 那是什么魔法?对我来说,这看起来是单独复制任何单个像素的最慢的解决方案。 (4认同)