java 图片格式转化 wmf,emf 转 svg,png

自己用到记录下,方便下次使用。

  1. wmf-svg-png
    相关maven依赖如下
<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>batik-codec</artifactId>
    <version>1.7</version>
</dependency>

示例代码如下

public static void main(String[] args) {
		// wmf 本地路径
		String wmfPath = "ceshi.wmf";
		// svg 本地临时路径
		String svgPath = "ceshi.svg";
		// png 本地临时路径
        String pngPath = "ceshi.png";

		// 是否替换符号字体
		boolean replaceSymbolFont = false;

		try {
			InputStream in = new FileInputStream(wmfPath);
			WmfParser parser = new WmfParser();
			final SvgGdi gdi = new SvgGdi(false);
			gdi.setReplaceSymbolFont(replaceSymbolFont);
			parser.parse(in, gdi);
			OutputStream out = null;
			try {
				out = new FileOutputStream(svgPath);
				if (svgPath.endsWith(".svgz")) {
					out = new GZIPOutputStream(out);
				}
				gdi.write(out);
			} finally {
				if (out != null) out.close();
			}
			// svg 转 png
            File svgFile = new File(svgPath);
            File pngFile = new File(pngPath);
            TranscoderInput transIn = new TranscoderInput(new FileInputStream(svgFile));
            TranscoderOutput transOut = new TranscoderOutput(new FileOutputStream(pngFile));
            JPEGTranscoder pngTranscoder = new JPEGTranscoder();
            pngTranscoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY,
                    new Float(.8));
            System.out.println("开始转png");
            //设置png画质精度0-1之间
            pngTranscoder.transcode(transIn, transOut);
            System.out.println("png成功");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
  1. emf-png
    需要导入org.apache.poi包 (最好是5.0.0以上版本,转出效果好点)
public static void main(String[] args) {
		// wmf本地路径
		String emfPath = "ceshi.emf";

		// png路径
        String pngPath = "ceshi.png";

        File emfFile = new File(emfPath);
        try {
            FileInputStream fis = new FileInputStream(emfFile);
            // for EMF / EMF+
            HemfPicture emf = new HemfPicture(fis);
            Dimension2D dim = emf.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);
            emf.draw(g, new Rectangle2D.Double(0, 0, width, height));
            g.dispose();
            // 保存图片
            ImageIO.write(bufImg, "PNG", new File(pngPath));
            // 关闭流
            if (fis != null)
                fis.close();
        } catch (IOException e) {
            e.printStackTrace();
            log.info("emf转png出现异常!");
        }
	}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要将WMF换为SVG并设置stroke-width,可以使用Java的Apache Batik库。Apache Batik是一个用于处理SVGJava库,它提供了将WMF换为SVG的功能。 以下是一个将WMF换为SVG并设置stroke-width的示例代码: ```java // 读取WMF文件 InputStream is = new FileInputStream("example.wmf"); // 创建换器 WMFTranscoder transcoder = new WMFTranscoder(); // 设置换参数 TranscodingHints hints = new TranscodingHints(); hints.put(ImageTranscoder.KEY_WIDTH, (float) 400); hints.put(ImageTranscoder.KEY_HEIGHT, (float) 300); transcoder.setTranscodingHints(hints); // 执行换 TranscoderInput input = new TranscoderInput(is); ByteArrayOutputStream os = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(os); transcoder.transcode(input, output); // 将换后的SVG字符串解析为DOM对象 String svgString = os.toString("UTF-8"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); InputSource isource = new InputSource(new StringReader(svgString)); Document doc = builder.parse(isource); // 设置stroke-width Element root = doc.getDocumentElement(); NodeList pathNodes = root.getElementsByTagName("path"); for (int i = 0; i < pathNodes.getLength(); i++) { Element path = (Element) pathNodes.item(i); path.setAttribute("stroke-width", "2"); } // 将DOM对象写入文件 Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(new DOMSource(doc), new StreamResult(new File("example.svg"))); ``` 在上面的代码中,首先读取WMF文件并创建WMFTranscoder对象。然后设置换参数并执行换,将换后的SVG字符串解析为DOM对象。接着,遍历所有的path元素并设置stroke-width属性的值为2。最后,将DOM对象写入SVG文件。 注意:在上面的代码中,设置的stroke-width值为2,可以根据需要进行修改。另外,还需要在代码中添加异常处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值