当前位置: 首页 > 知识库问答 >
问题:

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

陆浩博
2023-03-14

目前我正在开发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 的经验

请提供建议

共有1个答案

狄冠宇
2023-03-14

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

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

    < li >启动JavaFX应用程序或 < li >使用JFXPanel。

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

在处理方面,使用JFX面板的效率可能比使用JavaFX应用程序稍低。

在 StackOverflow 问题中对 JavaFX 系统的初始化有进一步的讨论:JavaFX 2.1:工具包未初始化。

JavaFX是一个单线程系统

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

  1. 当您收到对图表的传入请求时,请发布平台。runLater命令。runLater块中的所有代码都将放在一个队列中,该队列最终将在JavaFX应用程序线程上运行
  2. 在runLater块中,为图表创建一个场景,并将其快照为图像。snapshot的回调版本可能是这里使用的最合适的版本,因为它可能不会像JavaFX应用程序线程那样束缚JavaFX线程,尽管它可能会被欺骗
  3. 使用SwingFXUtils.fromFXImage将JavaFX图像转换为AWT图像
  4. 要在服务器处理程序线程中返回图像结果,请使用sarcan在:Return result from javafx platform runlater中概述的FutureTask技术

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

确保正常关机

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

JavaFX 2.2并没有真正被认证可以在一个无头服务器上运行

Swing应用程序可以使用系统属性java.awt.headless以无头模式运行。我不知道JavaFX有类似的属性,尽管可能有,如果有,您可以通过询问openjfx dev邮件列表来了解它是什么。

JavaFX主要设计为客户端图形工具包。虽然您可以让它在服务器上为您的应用程序令人满意地工作和运行,但要做到这一点,您可能需要确保服务器没有设置为无头服务器,并且它有适当的图形加速卡,以便在负载下提供合理的性能。

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

 类似资料:
  • 问题内容: 这听起来可能很奇怪,但是我想使用JavaFX在服务器端生成我的图表图像。因为JavaFX具有很好的canvas API来执行图像转换连接和定位。 特别是我有一个Spring MVC服务,可以将我的图表生成为图像。主要问题是如何从方便的Spring bean调用javaFX API。如果我尝试从Java应用程序运行Javafx代码(不扩展javaFX Application类),我会得到

  • 这听起来可能很奇怪,但我想使用 JavaFX 在服务器端生成我的图表图像。因为JavaFX有很好的画布API来执行图像转换连接和定位。 特别是我有一个SpringMVC服务来生成我的图表作为图像。主要问题是如何从一个方便的Spring bean调用javaFX API。如果我尝试只从java应用程序运行javafx代码(不扩展javaFX应用程序类),我会得到 你对如何解决这个问题有什么建议/想法

  • 我正在用java开发一个聊天机器人项目,在GUI中我使用JavaFX、IDE eclipse和scene builder 8.4.1。 我在向文本区域添加背景图像时遇到问题。这是我所做的一个屏幕截图,它什么也没有显示(甚至没有错误)。 以下是场景生成器生成的fxml代码:

  • 问题内容: 如何在Django中提供动态生成的图像? 我有一个html标签 链接到此请求处理程序,该请求处理程序创建一个内存中图像 我还计划将请求更改为AJAX,并添加某种缓存机制,但是我的理解是,这不会影响解决方案的这一部分。 问题答案: 我假设您正在使用PIL(Python影像库)。您需要用(例如,如果要提供PNG图像)替换最后一行: 有关更多信息,请参见此处。

  • 问题内容: 我正在搜索一个开放源Java库,以生成给定URL的缩略图。我需要捆绑此功能,而不是调用外部服务,例如Amazon或websnapr。 这篇文章中提到了http://www.webrenderer.com/:服务器生成的网络屏幕截图,但这是一种商业解决方案。 我希望有一个基于Java的解决方案,但可能需要研究执行外部过程(例如khtml2png)或集成类似html2ps的东西。 有什么建

  • 问题内容: 我需要一个服务器端脚本(PHP,Python)来将网页捕获为PNG,JPG,Tiff,GIF图像并将它们调整为缩略图。 做到这一点的最佳方法是什么? 问题答案: 您可能可以编写类似于webkit2png的内容,除非您的服务器已经运行Mac OSX。 更新: 我刚刚看到了其等效于Linux的链接:khtml2png