繁体   English   中英

使用Java FX在服务器端生成映像

[英]Generating image at server side using Java FX

目前我正在研究Jax Rs应用程序,我想将Base64编码的图像输出到客户端。 客户端是移动设备。

移动设备将使用一些参数调用此服务,服务器必须绘制条形图并将其作为base64编码的图像字符串发送回设备。

由于java Fx具有所需的图表库,我使用以下教程做了一个示例。 “快照”功能也按预期正常工作(创建屏幕图像)。

http://docs.oracle.com/javafx/2/charts/bar-chart.htm#CIHJFHDE

现在我想在不扩展Application类的情况下这样做,因为我需要在Jax Rs应用程序中使用它。 这样我就可以使用api创建一个BuffredImage然后用它来创建Base64字符串。

我找到了一种使用JFreeChart做到这一点的方法。 但我更喜欢我能用Java FX做到这一点。 我没有任何Java Fx的经验

请指教

基于服务器的JavaFX运行时初始化

要在服务器上运行JavaFX,您需要:

  1. 启动JavaFX 应用程序
  2. 使用JFXPanel

这些是在JavaFX 2中初始化JavaFX运行时系统的唯一方法,以便您可以使用它。

与使用JavaFX应用程序相比,使用JFXPanel处理效率可能略低。

在StackOverflow问题中进一步讨论了JavaFX系统的初始化: JavaFX 2.1:Toolkit未初始化

JavaFX是一个单线程系统

您可以在任何线程中创建大多数JavaFX组件。 但是,要在场景中呈现组件,必须在JavaFX Application线程上执行工作。 这意味着如果您有一个多线程服务器进程(大多数服务器都是这样,并且您想要生成多个图表),则需要使用并发约束单独绘制图表呈现请求。

  1. 当您收到图表的传入请求时,请发出Platform.runLater命令。 runLater块中的所有代码都将放在最终将在JavaFX应用程序线程上运行的队列中。
  2. 在runLater块中,为图表创建场景并将其快照到图像。 快照回调版本可能是最适合在这里使用的版本,因为它可能不会尽可能多地占用JavaFX应用程序线程,尽管它可能很难使用。
  3. 使用SwingFXUtils.fromFXImage将JavaFX图像转换为AWT图像。
  4. 要将图像结果返回到服务器处理程序线程中,请使用sarcan概述的FutureTask技术: 从javafx platform runlater返回结果

然后,您的服务器处理程序线程可以使用ImageIO将AWT图像转换为输出流,格式为png。 您可以获取结果流并对其进行Base64编码,并让服务器返回基本64位编码的流以响应原始图像请求调用。

确保正常关机

您需要在服务器启动时调用Platform.setImplicitExit(false)并注册一个关闭钩子或ServletContextListener来监视servlet何时被销毁,以便您还调用Platform.exit()来关闭JavaFX系统。 如果您不这样做,可能您的服务器将无法干净地关闭,因为JavaFX应用程序线程将继续运行等待工作。

JavaFX 2.2并未真正经过认证,无法在无头服务器上运行

Swing应用程序可以使用系统属性java.awt.headless 在无头模式下运行 我不知道JavaFX的类似属性,虽然可能有一个,如果有的话,你可以通过询问openjfx-dev邮件列表找出它是什么。

JavaFX主要设计为客户端图形工具包。 虽然您可以在服务器上运行并运行满意的应用程序,但是您可能需要确保服务器不是设置为无头服务器 ,并且它具有适当的图形加速卡以提供合理的性能。加载。

您可以在JavaFX问题跟踪器中提交正式支持无头模式的请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM