BufferedImage 到 JavaFX 图像

Posted

技术标签:

【中文标题】BufferedImage 到 JavaFX 图像【英文标题】:BufferedImage to JavaFX image 【发布时间】: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,但类型不兼容,我也无法转换它。我该如何纠正这个问题?

【问题讨论】:

【参考方案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”的评论。

以上是关于BufferedImage 到 JavaFX 图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaFX 显示 OpenCV Mat

将两个 BufferedImage 并排复制到一个图像中

如何通过 BufferedImage 将巨大的图像加载到 Java?

使用 Qt 在 C++ 中查看图像的 BufferedImage + jPanel 等效方法

java:BufferedImage判断图像通道顺序并转RGB/BGR

如何将 BufferedImage 绘制到 JPanel