【发布时间】:2023-03-03 21:57:02
【问题描述】:
我想将我的 JPanel 中的图像导出为矢量图形文件,以便可以以高于屏幕的分辨率对其进行编辑和打印。本质上,我希望它的paint() 函数与将绘图命令保存到矢量图形文件中的目标图形一起调用。
有什么好的、简单的方法可以做到这一点?推荐什么库?哪种矢量格式最好,为什么?
【问题讨论】:
标签: java swing graphics awt vector-graphics
我想将我的 JPanel 中的图像导出为矢量图形文件,以便可以以高于屏幕的分辨率对其进行编辑和打印。本质上,我希望它的paint() 函数与将绘图命令保存到矢量图形文件中的目标图形一起调用。
有什么好的、简单的方法可以做到这一点?推荐什么库?哪种矢量格式最好,为什么?
【问题讨论】:
标签: java swing graphics awt vector-graphics
看看The Java EPS Graphics2D package。
许多 Java 程序使用 Graphics2D 在屏幕上绘制内容,虽然将输出保存为 png 或 jpeg 文件很容易,但将其导出为 EPS 以包含在文档或纸张中会有点困难。
这个包使整个过程变得非常简单,因为您可以像使用 Graphics2D 对象一样使用 EpsGraphics2D 对象。唯一的区别是所有实现的方法都会创建 EPS 输出,这意味着您绘制的图表可以调整大小,而不会导致您在调整基于像素的图像(例如 JEPG 和 PNG 文件)大小时可能看到的任何锯齿状边缘。
【讨论】:
Apache Batik 将允许您绘制到 Graphics2D 对象的专门实现,然后导出为可缩放矢量图形 (.svg) 文件。然后,您可以使用支持 SVG 的浏览器查看/处理/打印它(Firefox 会自然处理它,ISTR、IE 和其他人可以使用插件)。
查看SVGGraphics2D 对象(过程记录在here)
【讨论】:
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();
}
}
还有一堆库 jars 也必须添加。
【讨论】:
这基本上是不可能直接实现的,因为低级 java api 以光栅(像素)的形式工作,并且从不以矢量格式存储。 (检查 java.awt.Graphics 的 API 以了解我的意思)。
有一些通用程序可以将光栅转换为矢量格式,这是我在快速搜索中找到的: http://autotrace.sourceforge.net/index.html
所以,使用这样的程序,您可以将您的问题分成两个较小的问题:
【讨论】: