Java wmf 转为png

wmf转png主要实现流程是:先转为svg,再由svg转为png

        缺点:注意部分公式图片会样式丢失

        优点:图片清晰,便于修改

直接上代码!!!

 

   <!-- wmf转svg转png -->
            <dependency>
                <groupId>net.arnx</groupId>
                <artifactId>wmf2svg</artifactId>
                <version>0.9.5</version>
            </dependency>

            <!--    svg转png-->
            <dependency>
                <groupId>org.apache.xmlgraphics</groupId>
                <artifactId>batik-codec</artifactId>
                <version>1.7</version>
            </dependency>
package cn.hls.winner.winner_problem_manage.utils;

import net.arnx.wmf2svg.gdi.svg.SvgGdi;
import net.arnx.wmf2svg.gdi.wmf.WmfParser;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.zip.GZIPOutputStream;

/**
 * @author lhz
 * @description TODO
 * @date 2023/9/18 14:56
 */
public class SvgToPngUtil {

    private static final Logger logger = LoggerFactory.getLogger(SvgToPngUtil.class);

        public static void main(String[] args) throws Exception {
            String path = "D:\\word\\imags\\8a2.wmf";
            // 将wmf转svg
            String svgFile = path.substring(0,
                    path.lastIndexOf(".wmf"))
                    + ".svg";
            wmfToSvg(path, svgFile);
            String s = readToString("D:\\word\\imags\\8a2.svg");
            convertToPng(s,"D:\\word\\imags\\8a2.png");
        }

        /**
         * 将wmf转换为svg
         *
         * @param src
         * @param dest
         */
        public static void wmfToSvg(String src, String dest){
            InputStream in = null;
            OutputStream out = null;
            try {
                in = new FileInputStream(src);
                WmfParser parser = new WmfParser();
                final SvgGdi gdi = new SvgGdi(false);
                parser.parse(in, gdi);
                Document doc = gdi.getDocument();
                out = new FileOutputStream(dest);
                if (dest.endsWith(".svgz")) {
                    out = new GZIPOutputStream(out);
                }
                output(doc, out);

            } catch (Exception e) {
                logger.error("将wmf转换为svg失败");
                throw new RuntimeException();
            }finally {
                assert out != null;
                try {
                    out.close();
                    in.close();
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

        /**
         * 输出信息
         *
         * @param doc
         * @param out
         * @throws Exception
         */
        private static void output(Document doc, OutputStream out) throws Exception {
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
                    "-//W3C//DTD SVG 1.0//EN");
            transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
                    "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd");
            transformer.transform(new DOMSource((Node) doc), new StreamResult(out));
            if (out != null) {
                out.flush();
                out.close();
            }
        }

        // 读取svg
        public static String readToString(String fileName) {
            String encoding = "UTF-8";
            File file = new File(fileName);
            Long filelength = file.length();
            byte[] filecontent = new byte[filelength.intValue()];
            try {
                FileInputStream in = new FileInputStream(file);
                in.read(filecontent);
                in.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                return new String(filecontent, encoding);
            } catch (UnsupportedEncodingException e) {
                System.err.println("The OS does not support " + encoding);
                e.printStackTrace();
                return null;
            }
        }

        //    svg转为图片
        public static void convertToPng(String svgCode, String pngFilePath) throws IOException, TranscoderException {

            File file = new File(pngFilePath);

            FileOutputStream outputStream = null;
            try {
                file.createNewFile();
                outputStream = new FileOutputStream(file);
                convertToPng(svgCode, outputStream);
            } finally {
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        logger.error("svg转为png失败");
                        throw new RuntimeException();
                    }
                }
            }
        }

        //将svgCode转换成png文件,直接输出到流中
        public static void convertToPng(String svgCode, OutputStream outputStream) throws TranscoderException, IOException {
            try {
                byte[] bytes = svgCode.getBytes(StandardCharsets.UTF_8);
                PNGTranscoder t = new PNGTranscoder();
                TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(bytes));
                TranscoderOutput output = new TranscoderOutput(outputStream);
                t.transcode(input, output);
                outputStream.flush();
            } finally {
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        logger.error("将svgCode转换成png文件失败");
                        throw new RuntimeException();
                    }
                }
            }
        }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用`javax.imageio`包中的`ImageIO`类来实现将WMF文件转换为PNG格式并保持大小的功能。下面是一个简单的示例代码: ```java import java.awt.Dimension; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class WMFConverter { public static void main(String[] args) { String wmfFile = "path/to/input.wmf"; String pngFile = "path/to/output.png"; try { File input = new File(wmfFile); Image wmfImage = ImageIO.read(input); int width = wmfImage.getWidth(null); int height = wmfImage.getHeight(null); BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); bufferedImage.getGraphics().drawImage(wmfImage, 0, 0, null); File output = new File(pngFile); ImageIO.write(bufferedImage, "png", output); System.out.println("WMF转换为PNG成功!"); } catch (IOException e) { System.out.println("WMF转换为PNG失败:" + e.getMessage()); } } } ``` 在上面的代码中,首先通过调用`ImageIO.read`方法将WMF文件读取为一个`Image`对象。然后,获取该对象的宽度和高度,并创建一个相同大小的`BufferedImage`。 接下来,使用`bufferedImage.getGraphics().drawImage`方法将WMF图像绘制到`BufferedImage`对象上。这样可以将WMF图像转换为与原始大小相同的PNG格式图像。 最后,将`BufferedImage`对象写入到指定的PNG文件中,通过调用`ImageIO.write`方法并指定格式为"png"来实现。 需要注意的是,上述代码仅适用于将WMF图像转换为PNG图像,并保持原始宽度和高度。若需要对图像进行其他处理,可以参考Java提供的其他图形处理库和API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值