将JPanel导出为矢量图形

6
我想将JPanel中的图像导出为矢量图形文件,以便在高于屏幕分辨率的情况下进行编辑和打印。基本上,我希望调用其paint()函数,并使用一个目标Graphics将绘图命令保存到矢量图形文件中。
有什么好的简单方法可以做到这一点?推荐使用哪些库?哪种矢量格式最好,为什么?
7个回答

7
请查看Java EPS Graphics2D package。许多Java程序使用Graphics2D在屏幕上绘制内容,虽然将输出保存为png或jpeg文件很容易,但将其导出为EPS以包含在文档或论文中则有些困难。该软件包使整个过程变得极其简单,因为您可以像使用Graphics2D对象一样使用EpsGraphics2D对象。唯一的区别是所有实现的方法都创建EPS输出,这意味着您绘制的图表可以调整大小而不会导致任何锯齿状边缘,这是您在调整像素为基础的图像(如JEPG和PNG文件)时可能会看到的现象。

看起来非常不错,谢谢。我不确定EPS是否适合我,但如果我选择了那条路,这肯定是一个很好的软件包。 - Carl Manaster
我会选择这个解决方案,谢谢。看起来EPS会很好地发挥作用。 - Carl Manaster

6

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

请参阅SVGGraphics2D对象(此处有详细说明)


我忘记了Batik,谢谢提醒。我以前见过它,我认为SVG可能是适合我的好格式。 - Carl Manaster
如果我可以选择两个答案,我也会选择这个答案;只是对于我的需求而言,EPS似乎比SVG更好。 - Carl Manaster
1
只是想提一下,Apache SVG 在导出渐变方面存在问题(它们没有被正确地导出)。此外,如果图形本身使用 SVG,则导出会出现问题。据我所知,SVGSalamander 没有编写到 SVG 的选项。 - Santosh Tiwari

3

皮埃尔提到的Java EPS看起来很不错,但如果不是您也可以考虑查看FreeHEP矢量图形。它被编写用于高能物理领域中Java的重用,包括一个矢量图形包,通过Graphics2D的实现完成。我们已经成功地使用它导出EPS多年。


谢谢!我最终使用了FreeHEP矢量图形,发现它非常易于使用且效果不错。方便且文档齐全。 - Carl Manaster

2

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

1

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();
    }
}

还需要添加一堆库文件。


0

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

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

因此,使用这样的程序,您可以将问题分解为两个较小的问题:

  1. 将您的JPanel转换为位图或文件(http://www.jguru.com/faq/view.jsp?EID=242020
  2. 在文件上运行autotrace。

1
你可以这样做,因为API会使用drawRectangle()等术语进行交互。这些内容将根据你绘制的组件以不同的方式呈现。 - Brian Agnew
1
当您在专用的Graphics2D实现上调用drawLine()时,它会将该线的向量表示写入文件。 - DJClayworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接