【问题标题】:Export JPanel to vector graphics将 JPanel 导出为矢量图形
【发布时间】:2023-03-03 21:57:02
【问题描述】:

我想将我的 JPanel 中的图像导出为矢量图形文件,以便可以以高于屏幕的分辨率对其进行编辑和打印。本质上,我希望它的paint() 函数与将绘图命令保存到矢量图形文件中的目标图形一起调用。

有什么好的、简单的方法可以做到这一点?推荐什么库?哪种矢量格式最好,为什么?

【问题讨论】:

    标签: java swing graphics awt vector-graphics


    【解决方案1】:

    看看The Java EPS Graphics2D package

    许多 Java 程序使用 Graphics2D 在屏幕上绘制内容,虽然将输出保存为 png 或 jpeg 文件很容易,但将其导出为 EPS 以包含在文档或纸张中会有点困难。

    这个包使整个过程变得非常简单,因为您可以像使用 Graphics2D 对象一样使用 EpsGraphics2D 对象。唯一的区别是所有实现的方法都会创建 EPS 输出,这意味着您绘制的图表可以调整大小,而不会导致您在调整基于像素的图像(例如 JEPG 和 PNG 文件)大小时可能看到的任何锯齿状边缘。

    【讨论】:

    • 看起来很不错;谢谢。我不确定 EPS 是否适合我,但我可能会走那条路,如果我这样做了,这肯定是一个不错的选择。
    • 我将采用这个解决方案;谢谢。看来 EPS 会很好地发挥作用。
    【解决方案2】:

    Apache Batik 将允许您绘制到 Graphics2D 对象的专门实现,然后导出为可缩放矢量图形 (.svg) 文件。然后,您可以使用支持 SVG 的浏览器查看/处理/打印它(Firefox 会自然处理它,ISTR、IE 和其他人可以使用插件)。

    查看SVGGraphics2D 对象(过程记录在here

    【讨论】:

    • 我忘记了蜡染;谢谢。我以前见过它,我认为 SVG 对我来说可能是一种很好的格式。
    • 如果我可以选择两个答案,我也会选择这个;只是 EPS 似乎比 SVG 更能满足我的需求。
    • 只想提一下 Apache SVG 在导出渐变方面存在问题(它们没有正确导出)。此外,如果图形本身使用 SVG,则导出会中断。 AFAIK SVGSalamander 没有写入 SVG 的选项。
    【解决方案3】:

    Pierre 提到的 Java EPS 看起来不错,但如果不是,您可能还想看看FreeHEP Vector Graphics。编写以允许在高能物理领域重用 Java,它包括一个矢量图形包,通过 Graphics2D 的实现完成。多年来,我们一直使用它非常成功地导出 EPS。

    【讨论】:

    • 谢谢;我最终使用了 FreeHEP Vector Graphics,发现它非常易于使用且非常好。方便且有据可查。
    【解决方案4】:

    我可以推荐 VectorGraphics2D 库 (LGPL)。虽然它不支持 Graphics2D 的所有功能,但我成功地将它用于我的项目。它为各种矢量文件格式提供 java.awt.Graphics2D 的实现。它只是将所有绘制操作导出为 EPS、SVG 或 PDF 文件。

    【讨论】:

      【解决方案5】:

      为有相同需求的人提供额外的库:

      这两个 GPLv3 并通过在 JFreeChartOrson Charts 中的广泛使用进行了良好测试。

      【讨论】:

        【解决方案6】:

        FreeHEP 似乎工作得很好,尽管它似乎不再被维护并且它的错误和论坛页面都消失了。只需几行,您就会得到一个弹出对话框,可以将任何组件保存为各种可扩展的常规图像格式。我们有一些具有挑战性的图像,使用 alpha 通道、旋转文本、由曲线界定的区域,并且它们保存得很好,使用 VectorGraphics2D 效果更好。

        到目前为止,我看到的唯一问题是 jpeg 保存,我的所有图像都是黑色的。鉴于 png 可以工作,加上所有矢量模式,这对我们来说并不是很重要,但我相信这对某些人来说是个问题。

        我必须添加这么多代码才能在所有这些模式下保存:

        public static void showImage(Component comp) 
        {
            try
            {
                ExportDialog export = new ExportDialog();
                export.showExportDialog( null, "Export view as ...", comp, "export" );
                System.err.println("Image save complete");
        
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        

        还有一堆库 jars 也必须添加。

        【讨论】:

          【解决方案7】:

          这基本上是不可能直接实现的,因为低级 java api 以光栅(像素)的形式工作,并且从不以矢量格式存储。 (检查 java.awt.Graphics 的 API 以了解我的意思)。

          有一些通用程序可以将光栅转换为矢量格式,这是我在快速搜索中找到的: http://autotrace.sourceforge.net/index.html

          所以,使用这样的程序,您可以将您的问题分成两个较小的问题:

          1. 将您的 JPanel 转换为位图或文件 (http://www.jguru.com/faq/view.jsp?EID=242020)
          2. 对文件运行自动跟踪。

          【讨论】:

          • 您可以这样做,因为 API 将根据 drawRectangle() 等进行对话。根据您要绘制到的组件,它会以不同的方式呈现
          • 当您在专用的 Graphics2D 实现上调用 drawLine() 时,它会将该行的矢量表示写入文件。
          猜你喜欢
          • 2017-04-18
          • 1970-01-01
          • 2011-08-05
          • 2011-12-14
          • 1970-01-01
          • 2013-01-01
          • 2014-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多