将尺寸超过39K的窗格导出到png文件

时间:2018-09-20 14:31:33

标签: javafx

我想从我的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

0 个答案:

没有答案