JavaFX绘制到图像

时间:2014-10-17 22:52:39

标签: java canvas javafx

有没有解决方案,如何在JavaFX中绘制与Canvas类似的图像?不是像素,而是像GraphicsContext2D这样的高级绘图功能。我正在尝试创建多层Canvas,并且为每个新图层使用另一个Canvas组件似乎是一种过度杀伤力。或者这是正确且唯一的优先方法吗?

1 个答案:

答案 0 :(得分:0)

使用多个canvas实例(每层一个),是创建多层画布的推荐方法(使用immediate draw API)。这种生成分层画布系统的方法已在Oracle JavaFX tutorials: Working with Canvas: Creating a Simple Layer System中记录并演示。

您的另一个选择可能是根本不使用画布,而是使用JavaFX scene graphretained draw API),将场景图节点放置在Panes内(每层一个窗格)并将所有图层窗格放在StackPane内。您可以通过调用StackPane上的节点snapshot API随时将生成的StackPane转换为图像。

  

Canvas是否也保留了API?由于所有操作都只是放在GrowableDataBuffer上并在事件上呈现?

是的,调用canvas API立即绘制有点用词不当。它确实像你说的那样工作。尽管如此,我发现在概念上将API视为即时绘图很有用,因为它几乎是开发人员使用API​​的样子,它更像是一个实现细节,它使用保留的数据结构来协助初始渲染。

据我了解实现设计,当您向画布发出绘图命令时,通常会将命令放在缓冲区中,并在第一次渲染画布pulse时将缓冲区刷新为图像纹理发生。因此,命令仅保留在内部实现中,直到第一个渲染事件。如果您确实在后续脉冲上发出了更多画布绘制命令,那么这些附加命令将被缓冲,然后在下一个脉冲的渲染阶段刷新。

例如,如果您在单个脉冲中为画布发出100万个绘图命令,那么您将看到暂停,因为这些命令被缓冲然后渲染,但您不会看到屏幕逐渐更新一百万次,只需一次更新。如果您在10个100万个命令的脉冲中发出1000万个绘图命令,那么您将看到屏幕更新10次。您必须向画布发出大量绘图命令才能看到此类行为。

如果您正在执行detailed performance analysis of a JavaFX application,了解实现以正确理解性能结果非常重要,但除此之外您不必担心。我不太可能这个实现细节会对您的项目产生严重的性能影响。