将JPanel导出为矢量图形

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

这样做的好方法是什么? 建议使用哪些库? 哪种矢量格式最好,为什么?

看看Java EPS Graphics2D包 。

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

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

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

请参阅SVGGraphics2D对象( 此处记录的过程)

皮埃尔提到的Java EPS看起来不错,但如果不是,你可能也想看看FreeHEP Vector Graphics 。 写入允许在高能物理领域中重用Java,它包括一个矢量图形包,通过Graphics2D的实现完成。 多年来,我们用它来非常成功地出口EPS。

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

针对具有相同要求的人员的附加库:

  • 适用于SVG,JFreeSVG, url为http://www.jfree.org/jfreesvg/
  • 对于PDF,OrsonPDF,请访问http://object-refinery.com/orsonpdf/index.html

这两个GPLv3都通过JFreeChart和Orson Charts中的广泛使用进行了充分测试。

FreeHEP似乎工作得很好,虽然它似乎不再维护,它的bug和论坛页面都消失了。 只需几行,您就可以获得一个弹出对话框,可以将任何组件保存为各种可伸缩和常规图像格式。 我们有一些具有挑战性的图像,使用alpha通道,旋转文本,由曲线限定的区域,并且使用VectorGraphics2D可以更好地保存,更好。

到目前为止我唯一看到的问题是jpeg save,它对我的​​所有图像都是黑色的。 这对我们来说不是很重要,因为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(); } } 

还有一堆必须添加的库jar。

这基本上不可能直接实现,因为低级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。