我们如何使用Java API将WMF/EMF(MS图元文件)转换为标准图像,如JPG或PNG?
我一直致力于使用Java将WMF/EMF图像转换为标准图像格式,如JPG或PNG 可用的最佳选项是什么?这里有一种方法我们如何使用Java API将WMF/EMF(MS图元文件)转换为标准图像,如JPG或PNG?,java,image,image-processing,Java,Image,Image Processing,我一直致力于使用Java将WMF/EMF图像转换为标准图像格式,如JPG或PNG 可用的最佳选项是什么?这里有一种方法 获取(或制作)一个可以呈现相关文件的Java组件 创建一个与组件显示图像所需大小相同的buffereImage 从缓冲区图像中获取图形对象 调用renderComponent.paintComponent(图形) 使用ImageIO.write()变体之一保存图像 有关步骤2-5,请参见我对的回答。第一步。这是我想问谷歌的问题 是一个用Java处理SVG的工具包。包括一些转换器
buffereImage
缓冲区图像
中获取图形
对象renderComponent.paintComponent(图形)
ImageIO.write()
变体之一保存图像另一种选择是。它不是Java而是Java绑定:而且。wmf是一种矢量文件格式。为了获得最佳结果,请将它们转换为
.svg
或.pdf
格式。
我分两个阶段做
1) wmf2fig——自动XXXX.wmf
2) 图2PDF——nogv XXXX.fig
我创建了一个用于批量转换的python脚本
import subprocess as sbp
a = sbp.Popen("ls *.wmf",shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
filelist = a.communicate()[0].splitlines()
for ele in filelist:
cmdarg = 'wmf2fig --auto '+ ele.rsplit('.',1)[0]+'.wmf'
a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
out = a.communicate()
for ele in filelist:
cmdarg = 'fig2pdf --nogv '+ ele.rsplit('.',1)[0]+'.fig'
a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
out = a.communicate()
cmdarg = 'rm *.fig'
a = sbp.Popen(cmdarg, shell=True, stderr=sbp.PIPE, stdout=sbp.PIPE)
out = a.communicate()
不久前,我围绕Batik软件包(如所述)创建了一些包装,为SVG和WMF/EMF提供了ImageIO支持 使用这些插件,您应该能够编写:
ImageIO.write(ImageIO.read(wmfFile), pngFile, "png");
上的源代码
虽然ImageIO插件很方便,但im4java和JMagick可能仍然有更好的格式支持。如果您在Windows环境中部署应用程序,则可以为您处理转换
Image image = new Image(Display.getCurrent(), "test.wmf");
ImageLoader loader = new ImageLoader();
loader.data = new ImageData[] { image.getImageData() };
try(FileOutputStream stream = new FileOutputStream("test.png"))
{
loader.save(stream, SWT.IMAGE_PNG);
}
image.dispose();
SWT的目的是围绕本机功能提供一个Java包装器,在本例中,它直接调用windows GDI,以使其呈现WMF。可以向我展示一段代码..以便我理解..我无法从相关文件中创建图像(Java.awt.image)。这再一次在创建BuffereImage时提出了一个问题。希望你能理解。制作WMF/EMF图像的人应该被枪杀,但这是值得的:我确信,优秀的(免费的)ImageMagick过去能够转换WMF文件。过去,ImageMagick还有一个Java包装器(如果内存可用,则称为JMagick)。所以你可能想看看里面。也就是说,据我回忆,WMF/EMF只是围绕各种格式的“外壳”或“包装器”,因此它可能是一个移动的目标,很可能有很多不同的WMF/EMF文件,我真的不确定是否仍然正确处理了这些文件。它过去是这样工作的……虽然答案不是关于Java,但我同意最好将转换后的结果保持为向量。蜡染将能够转换为SVG。