Convert WMF to PNG/BMP/JPG

后端 未结 3 2088
闹比i
闹比i 2020-12-20 22:57

How can I convert one WMF file to PNG/BMP/JPG format with custom output resolution?

Example: Take WMF file and outputs PNG file with 2000x2000 px.

Thanks in

相关标签:
3条回答
  • 2020-12-20 23:04

    You can use different tools for this format. You can choose for example GIMP. In Java you have a library for converting WMF files.

    0 讨论(0)
  • 2020-12-20 23:22

    WMF, EMF and EMF+ are integral parts of slideshows, therefore I've developed a renderer for those as part of Apache POI. As for the upcoming POI-4.1.2 this is still work in progress - if you have any rendering issues, please upload your file in a new bug report in our bugzilla.

    The main description can be found in the POI documentation.

    Here is an excerpt:

    #1 - Use PPTX2PNG via file or stdin

    For file system access, you need to save your slideshow/WMF/EMF/EMF+ first to disc and then call PPTX2PNG.main() with the corresponding parameters.

    for stdin access, you need to redirect System.in before:

    /* 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 - Render WMF / EMF / EMF+ via the *Picture classes

    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"));
    }
    
    0 讨论(0)
  • 2020-12-20 23:24

    You can use the excelent Batik ( http://xmlgraphics.apache.org/batik/ ) lib to achieve this. But you will need to follow this steps:

    1. Convert the WMF file to SVG using the WMFTranscoder
    2. Convert the SVG to JGP using the JPGTranscoder

    WMF >> SVG >> JPG

    Here is a discussion on coderanch about it: http://www.coderanch.com/t/422868/java/java/converting-WMF-Windows-Meta-File

    0 讨论(0)
提交回复
热议问题