将WMF转换为PNG/BMP/JPG

6

如何将一个WMF文件转换为PNG/BMP/JPG格式,并设置输出分辨率?

例如:将WMF文件转换为2000x2000像素的PNG文件。

谢谢。


可靠地转换此格式的唯一方法是使用Windows的GDI API,您的操作系统是什么?我看到了一个在线转换器(zamzar.com),似乎可以处理该格式,但我不确定效果如何。 - mmgp
我正在使用带有Java 6的Ubuntu。 - user1970058
那么你需要运气,也就是说,你的WMF文件很简单,不使用GDI(+)的较新API调用。 - mmgp
4个回答

5

有趣,它是否保证在使用不同于Windows的操作系统时始终正常工作?如果是这样,它是否也完全支持较新的WMF格式:EMF和EMF+? - mmgp
啊,现在我在它的页面上看到一个脚注:“Windows Metafiles (WMF) 通过 Apache Batik 中的类得到支持。目前,对于这种格式的支持是实验性的,可能不总是按预期工作。” - mmgp
@mmgp,是的,它也适用于Linux,去年我做了类似的事情,它完美地工作。关于更新的WMF格式,我不知道,我只使用过由AutoCAD导出的WMF。 - Tiago
@mmgp,有时候Batik无法转换某些对象并给出警告,但这是我能找到的最佳转换方式... - Tiago
有一个名为unoconv的工具可能更好,还有来自Mono的libgdiplus也可能更好。 - mmgp

2
WMF、EMF和EMF+是演示文稿的组成部分,因此我已经作为Apache POI的一部分开发了这些的渲染器。至于即将推出的POI-4.1.2版本,这仍然是正在进行中的工作——如果您有任何渲染问题,请在我们的bugzilla上上传您的文件new bug report
主要描述可以在POI 文档中找到。
以下是摘录:
#1 - 通过文件或stdin使用PPTX2PNG
对于文件系统访问,您需要首先将您的幻灯片/WMF/EMF/EMF+保存到磁盘上,然后使用相应的参数调用PPTX2PNG.main()
对于stdin访问,您需要在之前重定向System.in
/* the file content */
InputStream is = ...;
/* Save and set System.in */
InputStream oldIn = System.in;
try {
    System.setIn(is);
    String[] args = {
        "-format", "png", // png,gif,jpg,svg or null for test
        "-outdir", new File("out/").getCanonicalPath(),
        "-outfile", "export.png",
        "-fixside", "long",
        "-scale", "800",
        "-ignoreParse",
        "stdin"
    };
    PPTX2PNG.main(args);
} finally {
    System.setIn(oldIn);
}

#2 - 通过*Picture类呈现WMF / EMF / EMF+

File f = samples.getFile("santa.wmf");
try (FileInputStream fis = new FileInputStream(f)) {
    // for WMF
    HwmfPicture wmf = new HwmfPicture(fis);
    // for EMF / EMF+
    HemfPicture emf = new HemfPicture(fis);
    Dimension dim = wmf.getSize();
    int width = Units.pointsToPixel(dim.getWidth());
    // keep aspect ratio for height
    int height = Units.pointsToPixel(dim.getHeight());
    double max = Math.max(width, height);
    if (max > 1500) {
    width *= 1500/max;
    height *= 1500/max;
    }
    BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = bufImg.createGraphics();
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    wmf.draw(g, new Rectangle2D.Double(0,0,width,height));
    g.dispose();
    ImageIO.write(bufImg, "PNG", new File("bla.png"));
}

1
这对我非常有效。只是需要注意的是,我必须拉取poi-scratchpad工件(而不仅仅是“poi”),以获取org.apache.poi.hemf包下的类。 - Tim Russell

0

0

我写了一个绕过方法此处,对于Java,我学到我可以运行shell命令并遵循这个问题中的答案。对于WMF,请先将其转换为EMF,然后按照这个答案的指示进行。


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