我想将我的 JPanel 中的图像导出为矢量图形文件,以便可以以高于屏幕的分辨率对其进行编辑和打印。本质上,我希望paint()
使用将绘图命令保存到矢量图形文件中的目标 Graphics 来调用它的函数。
有什么好的,简单的方法可以做到这一点?推荐什么库?哪种矢量格式最好,为什么?
我想将我的 JPanel 中的图像导出为矢量图形文件,以便可以以高于屏幕的分辨率对其进行编辑和打印。本质上,我希望paint()
使用将绘图命令保存到矢量图形文件中的目标 Graphics 来调用它的函数。
有什么好的,简单的方法可以做到这一点?推荐什么库?哪种矢量格式最好,为什么?
许多 Java 程序使用 Graphics2D 在屏幕上绘制内容,虽然将输出保存为 png 或 jpeg 文件很容易,但将其导出为 EPS 以包含在文档或纸张中会有点困难。
这个包使整个过程变得非常简单,因为您可以像使用 Graphics2D 对象一样使用 EpsGraphics2D 对象。唯一的区别是所有实现的方法都会创建 EPS 输出,这意味着可以调整您绘制的图表的大小,而不会导致您在调整基于像素的图像(例如 JEPG 和 PNG 文件)大小时可能看到的任何锯齿状边缘。
Apache Batik将让您绘制到 Graphics2D 对象的专门实现,然后导出为可缩放矢量图形 (.svg) 文件。然后,您可以使用支持 SVG 的浏览器查看/处理/打印它(Firefox 会自然处理它,ISTR、IE 和其他人可以使用插件)。
请参阅SVGGraphics2D对象(此处记录的过程)
Pierre 提到的 Java EPS 看起来不错,但如果不是,您可能还想查看FreeHEP Vector Graphics。编写以允许在高能物理领域重用 Java,它包括一个矢量图形包,通过 Graphics2D 的实现完成。多年来,我们一直使用它非常成功地出口 EPS。
我可以推荐VectorGraphics2D库 (LGPL)。虽然它不支持 Graphics2D 的所有功能,但我成功地将它用于我的项目。它为各种矢量文件格式提供 java.awt.Graphics2D 的实现。它只是将所有绘制操作导出到 EPS、SVG 或 PDF 文件。
为具有相同需求的人提供的附加库:
这两个 GPLv3 都通过在JFreeChart和Orson Charts中的广泛使用进行了很好的测试。
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();
}
}
还必须添加一堆库 jar。
这基本上是不可能直接实现的,因为低级 java api 根据光栅(像素)工作,并且从不以矢量格式存储。(检查 java.awt.Graphics 的 API 以了解我的意思)。
有一些通用程序可以将光栅转换为矢量格式,这是我在快速搜索中找到的:http: //autotrace.sourceforge.net/index.html
因此,使用这样的程序,您可以将问题分成两个较小的问题: