【问题标题】:Rendering to a SWING surface (e. g. JPanel) using Cairo使用 Cairo 渲染到 SWING 表面(例如 JPanel)
【发布时间】:2011-11-07 13:37:22
【问题描述】:

我目前正在开展一个项目,我需要在墨卡托投影的世界地图上绘制卫星的预测足迹,并可能进行缩放/裁剪/等。完成到地图上。

我认为 Cairo 将是用于此目的的一个很好的库。有可用的 Java 绑定。但是,我只是找不到让它呈现到 SWING GUI 上的方法(例如,在 JPanel 的表面上)。我考虑过渲染到一个字节缓冲区并使用Java2D逐个像素地绘制出来,但是我找不到任何API调用来让Cairo渲染到一个缓冲区中(这很奇怪,因为这是我最基本的功能之一' d 期望得到这样的库的支持)。

我有什么办法可以做到这一点?我知道有 Java2D,但它相当基础。为此,我非常感谢一个更强大、更广泛、经过良好测试、高质量、免费 (LGPL) 的图形库。如果我能以某种方式让它与 SWING 一起工作,Cairo 会非常适合。

非常感谢您的建议。

【问题讨论】:

  • 通常,您可以使用任何您想要的组件(例如 JPanel),然后调用 .getGraphics() 来为该组件获取可渲染的 Graphics 对象。然后,您使用该 Graphics 对象进行渲染。你已经尝试了什么?您的问题没有说明您已经尝试过什么?您是否已经完成了教程 (download.oracle.com/javase/tutorial/2d/index.html)?
  • @normalocity:我想使用 Cairo (cairographics.org) 来进行渲染,因为它比 Java2D API 更强大、更方便。 Cairo 的 Java 绑定 API 记录在此处:link 我只是无法将其渲染到 SWING 组件(例如 JPanel)或字节缓冲区中。在后一种情况下,我可能会绘制出 Cairo 使用 Java2D 创建的光栅化渲染。但我只是没有看到 API 公开任何“渲染到缓冲区”功能。

标签: java swing rendering jpanel cairo


【解决方案1】:

Cairo 的基本原理之一是任何非抽象图像上下文都绑定到支持的后端之一。 我从未尝试过 Java 绑定,但它们很可能是一个薄层,不提供新的表面类型 - 您应该使用“图像表面”类型。

在库的 C 文档中,有一个“cairo_image_surface_get_data()”调用 (这里:http://cairographics.org/manual/cairo-Image-Surfaces.html)它提供了一个对缓冲区的访问权限。 由于实际使用其内容所需的低级内存访问,绑定可能没有将其暴露给 Java。如果这是真的,那么我建议您采取以下解决方法:

(1) 将结果渲染到 Cairo 图像表面,(2) 写入包含表面内容的临时文件,(3) 使用 Java 2D API 读取并显示临时文件。

【讨论】:

    【解决方案2】:

    这是example。 我在http://java-gnome.sourceforge.net 上找到了这个例子 它创建一个 gtk 窗口,实际上是一个 gtk DrawingArea 小部件,onDraw() 事件使用 cairo。 我在linux上编译运行,效果很好。

    然而 java-gnome 似乎只有 linux 二进制文件。也许有人可以制作 Windows 二进制文件,但需要一些工作。

    这是一个gtk窗口,所以和swing无关。 如果 gtk(java-gnome) 可以满足您的需求,也许您不需要 swing。

    如果你必须使用 swing,你可以使用 cairo 渲染到内存中的图像,然后通过类似覆盖 paintComponent() 方法的方式将其显示给 JComponent。我不知道性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      相关资源
      最近更新 更多