java将svg图片转换为png格式图片|Java开发|码途山海.智隐长卷 -

程序人生|重庆纽新

找回密码
立即注册

QQ登录

只需一步,快速开始

欢迎访问【程序人生-重庆纽新】,本网站为软件开发人员视觉的IT资讯、软件开发中各种问题的解决办法!!
搜索
发新帖


2308

积分

0

好友

259

主题
楼主
发表于 2015-7-28 12:30:01 | 查看: 2467| 回复: 3

有时候在客户端使用svg画图,而在服务器端需要同样的图片,在服务器端重新画一遍是非常费事的。这时候我们就可以利用已有的svg直接通过下面的类转换成png格式。

使用这个方法需要引用batic相关的包,maven pom文件如下:

  1. <!-- svg 生成png格式图片  -->
  2. <dependency><groupId>batik</groupId><artifactId>batik-svggen</artifactId><version>1.6</version></dependency>        
  3. <dependency><groupId>batik</groupId><artifactId>batik-awt-util</artifactId><version>1.6</version></dependency>
  4. <dependency><groupId>batik</groupId><artifactId>batik-bridge</artifactId><version>1.6</version></dependency>
  5. <dependency><groupId>batik</groupId><artifactId>batik-css</artifactId><version>1.6</version></dependency>
  6. <dependency><groupId>batik</groupId><artifactId>batik-dom</artifactId><version>1.6</version></dependency>
  7. <dependency><groupId>batik</groupId><artifactId>batik-gvt</artifactId><version>1.6</version></dependency>
  8. <dependency><groupId>batik</groupId><artifactId>batik-parser</artifactId><version>1.6</version></dependency>
  9. <dependency><groupId>batik</groupId><artifactId>batik-script</artifactId><version>1.6</version></dependency>
  10. <dependency><groupId>batik</groupId><artifactId>batik-svg-dom</artifactId><version>1.6</version></dependency>
  11. <dependency><groupId>batik</groupId><artifactId>batik-transcoder</artifactId><version>1.6</version></dependency>
  12. <dependency><groupId>batik</groupId><artifactId>batik-util</artifactId><version>1.6</version></dependency>
  13. <dependency><groupId>batik</groupId><artifactId>batik-xml</artifactId><version>1.6</version></dependency>
  14. <!-- 此处不能使用2.9.1版本,使用2.9.1生成png会失败 -->
  15. <dependency><groupId>xerces</groupId><artifactId>xercesImpl</artifactId><version>2.5.0</version></dependency>
  16. <dependency><groupId>xml-apis</groupId><artifactId>xmlParserAPIs</artifactId><version>2.0.2</version></dependency>

  17. <dependency><groupId>org.axsl.org.w3c.dom.svg</groupId><artifactId>svg-dom-java</artifactId><version>1.1</version></dependency>
  18. <dependency><groupId>xml-apis</groupId>    <artifactId>xml-apis</artifactId><version>2.0.0</version></dependency>

  19. <dependency><groupId>org.w3c.css</groupId> <artifactId>sac</artifactId>    <version>1.3</version></dependency>
  20. <!-- svg 生成png格式图片结束  -->
复制代码
  1. package cn.outofmemory.util;

  2. import java.io.ByteArrayInputStream;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;

  7. import org.apache.batik.transcoder.TranscoderException;
  8. import org.apache.batik.transcoder.TranscoderInput;
  9. import org.apache.batik.transcoder.TranscoderOutput;
  10. import org.apache.batik.transcoder.image.PNGTranscoder;

  11. /**
  12. * 将svg转换为png格式的图片
  13. *
  14. *
  15. */
  16. public abstract class SvgPngConverter {

  17.     /**
  18.      * 将svg字符串转换为png
  19.      *
  20.      * @param svgCode svg代码
  21.      * @param pngFilePath 保存的路径
  22.      * @throws TranscoderException svg代码异常
  23.      * @throws IOException io错误
  24.      */
  25.     public static void convertToPng(String svgCode, String pngFilePath) throws IOException,
  26.             TranscoderException {

  27.         File file = new File(pngFilePath);

  28.         FileOutputStream outputStream = null;
  29.         try {
  30.             file.createNewFile();
  31.             outputStream = new FileOutputStream(file);
  32.             convertToPng(svgCode, outputStream);
  33.         } finally {
  34.             if (outputStream != null) {
  35.                 try {
  36.                     outputStream.close();
  37.                 } catch (IOException e) {
  38.                     e.printStackTrace();
  39.                 }
  40.             }
  41.         }
  42.     }

  43.     /**
  44.      * 将svgCode转换成png文件,直接输出到流中
  45.      *
  46.      * @param svgCode svg代码
  47.      * @param outputStream 输出流
  48.      * @throws TranscoderException 异常
  49.      * @throws IOException io异常
  50.      */
  51.     public static void convertToPng(String svgCode, OutputStream outputStream)
  52.             throws TranscoderException, IOException {
  53.         try {
  54.             byte[] bytes = svgCode.getBytes("utf-8");
  55.             PNGTranscoder t = new PNGTranscoder();
  56.             TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(bytes));
  57.             TranscoderOutput output = new TranscoderOutput(outputStream);
  58.             t.transcode(input, output);
  59.             outputStream.flush();
  60.         } finally {
  61.             if (outputStream != null) {
  62.                 try {
  63.                     outputStream.close();
  64.                 } catch (IOException e) {
  65.                     e.printStackTrace();
  66.                 }
  67.             }
  68.         }
  69.     }
  70. }
复制代码


收藏回复 只看该作者 道具 举报


沙发
发表于 2015-7-28 12:31:57
现在的问题是,svg中直接使用的图片,能正常处理吗?如果能,需要如何处理图片路径呢?

回复 只看该作者 道具 举报


板凳
发表于 2015-7-29 13:27:35
最近在使用JAVA利用batic包SVG转png/pdf时总是无法解析xml文件里的image标签,在测试时突然发现只要把image的xlink:href URL写成http从网络上寻找的就可以,如:
<image xlink:href="http://www.zhixing123/image.svg"></image>
但是写成相对于JAVA项目路径,如
<image xlink:href="image.svg"></image>
却不可以,最后我索性写成绝对路径
<image xlink:href="C:/image.svg"></image>
后来Google才知道如果要使用本地图片资源,需要在绝对路径前添加file:///,如:
<image xlink:href="file:///C:/image.svg"></image>

回复 只看该作者 道具 举报

高级模式
B Color Image Link Quote Code Smilies



QQ|小黑屋| 码途山海.智隐长卷 渝ICP备15002301号-2   渝公网安备50011202504426

GMT+8, 2025-5-18 05:08 , Processed in 0.043124 second(s), 27 queries .

©Copyright 程序人生!

©2012-2015重庆纽新

快速回复 返回顶部 返回列表