我想从我的Hbox做快照。我有以下代码:
public void saveScreen(ActionEvent actionEvent) {
WritableImage image = ig.doScreen(content, context.getCurrentFamily().getName());
File file = new File("./GenTree" + Instant.now().toEpochMilli() + ".png");
try {
ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file);
} catch (IOException e) {
e.printStackTrace();
}
}
public WritableImage doScreen(Pane nodeContent, String text) {
this.title.setText(text);
content.getChildren().clear();
nodeContent.getChildren().forEach(child -> {
content.getChildren().add(new ImageView(child.snapshot(snapshotParameters, null)));
});
generateImagePane();
Scene scene = new Scene(imagePane);
return scene.snapshot(null);
}
当生成的图像很小(4kx4k p.ex)时,没有问题,它会按预期生成。
当它更大时,我会出现如下错误:
java.lang.RuntimeException: Requested texture dimensions (34966x957) require dimensions (0x957) that exceed maximum texture size (16384)
at com.sun.prism.es2.ES2RTTexture.create(ES2RTTexture.java:220)
(...)
我通过禁用图形加速应用了解决方法:
-Dprism.order=sw
它有帮助,但没有解决我的问题。现在,将生成图像,但是当其大小如本例所示:39K时,图像将被截断。在我的示例中,要保存的Hbox中有52个元素。每个元素包含4张小图片。
尽管快照39-41正确可见,但其他快照却不可见,但存在白色场,即使在第41个元素之后也未渲染。
如您在上面的代码中看到的,我将获取每个Hbox的子对象并进行快照。这是因为,当我从整个Hbox进行快照时,我发现在前10个对象中所有小图片都可以正确渲染。但是到最后,更多的小图片没有显示(只有一种彩色背景)。鞋last的元素一点也没有显示出来。
控制台上没有错误。只有启用了Dprism verbose,我才能看到此日志:
Growing pool com.sun.prism.sw.SWTexturePool@754645c9 target to 147 837 360