java 通过batik 把svg格式的矢量图生成png图片

使用batik.jar文件把svg格式转换成png图片输出的方法如下:

1.首先需要下载batik

最新版本的batik jar包下载地址

batik-1.7.zip

batik介绍:

Batik,你可以在JAVA可以使用的地方操作SVG文档,您还可以在你的应用程序使用Batik模块来生成 , 处理和转码SVG图像。Batik很容易让基于Java的应用程序或小程序来处理SVG内容。 例如,使用Batik的SVG的发生器模块 ,Java应用程序或小程序可以很轻松地导出SVG格式的图形。

2.创建java类文件

代码如下:

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;

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;

/**
 * 将svg转换为png格式的图片
 * 
 * 
 */
public  class SvgPngConverter {

    /**
     * 将svg字符串转换为png
     * 
     *  @param svgCode svg代码
     * @param pngFilePath 保存的路径
     * @throws TranscoderException svg代码异常
     * @throws IOException io错误
     */
    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) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将svgCode转换成png文件,直接输出到流中
     * 
     * @param svgCode svg代码
     * @param outputStream 输出流
     * @throws TranscoderException 异常
     * @throws IOException io异常
     */
    public static void convertToPng(String svgCode, OutputStream outputStream)
            throws TranscoderException, IOException {
        try {
            byte[] bytes = svgCode.getBytes("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) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    public static void main(String[] args){
    	StringBuffer svgCode = new  StringBuffer();
//    	File file = new File("C:\\svgcon.txt");
//    	
//    	try {
//			BufferedReader br = new BufferedReader(new FileReader(file));
//			String tempString = null;
//			while((tempString = br.readLine()) != null){
//				svgCode.append(tempString);
//			}
//			System.out.println("svg file content :" + svgCode.toString());
//			br.close();
//		}
//		catch (Exception e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
    	
    	svgCode.append("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"473\" height=\"190\" style=\"transform: translate(-235px, -75px);\" viewBox=\"-235 -75 1258 399\"> <g><path stroke-linejoin=\"round\" stroke-linecap=\"round\" stroke=\"#0033ff\" stroke-opacity=\"0.5\" stroke-width=\"15\" fill=\"none\" class=\"leaflet-clickable\" d=\"M404 107L470 174\"/></g> </svg>");
    	String pngFilePath = "C:\\Apache2.2\\htdocs\\images\\sss.png";
    	try {
    		convertToPng(svgCode.toString(), pngFilePath);
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (TranscoderException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

生成的内容是一条蓝色的直线

特别注意

svg标签上要加入xmlns属性 如下内容:

xmlns="http://www.w3.org/2000/svg"

如过svg标签没有添加这个xmlns属性会出现如下错误:

org.apache.batik.transcoder.TranscoderException: null
Enclosed Exception:
Root element namespace does not match that requested:
Requested: http://www.w3.org/2000/svg
Found: null
    at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:136)
    at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)
    at SvgPngConverter.convertToPng(SvgPngConverter.java:68)
    at SvgPngConverter.convertToPng(SvgPngConverter.java:41)
    at SvgPngConverter.main(SvgPngConverter.java:102)

 

来源://作者:/更新时间:2013-11-01
相关文章
评论:
验证码:
匿名评论: