【问题标题】:Convert WMF to PNG/BMP/JPG将 WMF 转换为 PNG/BMP/JPG
【发布时间】:2012-12-26 02:10:38
【问题描述】:

如何将一个 WMF 文件转换为具有自定义输出分辨率的 PNG/BMP/JPG 格式?

示例:获取 WMF 文件并输出 2000x2000 像素的 PNG 文件。

提前致谢。

【问题讨论】:

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

标签: java image-processing png wmf


【解决方案1】:

您可以使用出色的 Batik (http://xmlgraphics.apache.org/batik/) 库来实现此目的。但是您需要按照以下步骤操作:

  1. 使用 WMFTranscoder 将 WMF 文件转换为 SVG
  2. 使用 JPGTranscoder 将 SVG 转换为 JGP

WMF >> SVG >> JPG

这里是关于 coderanch 的讨论:http://www.coderanch.com/t/422868/java/java/converting-WMF-Windows-Meta-File

【讨论】:

  • 有趣,它是否保证即使使用不同于 Windows 的操作系统也能正常工作?在这种情况下,它是否也完全支持较新的 WMF 格式:EMF 和 EMF+?
  • 啊,现在我在它的页面上看到一个脚注:“通过 Apache Batik 中的类支持 Windows 元文件 (WMF)。目前,对这种格式的支持是实验性的,可能并不总是按预期工作。”
  • @mmgp,是的,它也可以在 Linux 上运行,去年我做了类似的事情,它运行良好。关于较新的WMF格式我不知道,我只用过autocad导出的WMF。
  • @mmgp,有时蜡染无法转换某些对象并发出警告,但这是我能找到的进行这种转换的最佳方式...
  • unoconv 工具可能会更好,还有 Mono 的 libgdiplus 可能也会更好。
【解决方案2】:

WMF、EMF 和 EMF+ 是幻灯片的组成部分,因此我为它们开发了一个渲染器作为 Apache POI 的一部分。至于即将发布的 POI-4.1.2,这仍在进行中 - 如果您有任何渲染问题,请在我们的 bugzilla 中将您的文件上传到 new bug report

主要描述可以在POI documentation找到。

摘录如下:

#1 - 通过文件或标准输入使用 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"));
}

【讨论】:

  • 这对我来说效果很好。请注意,我必须拉入 poi-scratchpad 工件(而不仅仅是“poi”)才能获取 org.apache.poi.hemf 包下的类。
【解决方案3】:

对于这种格式,您可以使用 different tools。您可以选择例如 GIMP。在 Java 中,您有一个 library for converting WMF files

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 2012-04-03
    • 2018-08-27
    • 2012-01-24
    • 2010-10-19
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多