【问题标题】:BufferedImage to JavaFX imageBufferedImage 到 JavaFX 图像
【发布时间】:2015-09-07 07:37:13
【问题描述】:

我有一张从主监视器截屏的图像,我想将其添加到 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;
}

我正在尝试将BufferedImage capture 设置为javafx.scene.image.Image image,但类型不兼容,我也无法转换它。我该如何纠正这个问题?

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    你可以使用

    Image image = SwingFXUtils.toFXImage(capture, null);
    

    【讨论】:

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

    通常最好的选择是 java9 中的 Image image = SwingFXUtils.toFXImage(capture, null); 或更大....但就 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();
    }
    

    【讨论】:

    • 这是什么魔法?对我来说,这似乎是单独复制任何单个像素的最慢的解决方案。
    • 看起来像那样,但相信我,它工作得很快,我在 Raspian 设备中测试它(在缓慢的互联网中也有缓慢的性能)和两个 windows 和 linux(ubuntu),行为是一样的(始终使用 jre1.8 中的 javafx)。我需要找到另一个解决方案,这就是我发现的。使用最适合您的解决方案
    • 如果您只想将 byte[] 转换为 JavaFX 图像,则可以跳过创建 BufferedImage - 请参阅最佳答案下用户“FinalArt2005”的评论。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    相关资源
    最近更新 更多