将WMF转换为PNG / BMP / JPG

时间:2013-01-11 13:21:44

标签: java image-processing png wmf

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

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

提前致谢。

3 个答案:

答案 0 :(得分:5)

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

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

    WMF>> SVG>> JPG

    以下是关于它的代码讨论:http://www.coderanch.com/t/422868/java/java/converting-WMF-Windows-Meta-File

答案 1 :(得分:0)

您可以使用different tools作为此格式。您可以选择例如GIMP。在Java中,您有一个library for converting WMF files

答案 2 :(得分:0)

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 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"));
}