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 图像的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 BufferedImage 将巨大的图像加载到 Java?
使用 Qt 在 C++ 中查看图像的 BufferedImage + jPanel 等效方法