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)