java batik svg转png报错,球大神!!!在线等
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java batik svg转png报错,球大神!!!在线等相关的知识,希望对你有一定的参考价值。
报错内容:
org.apache.batik.transcoder.TranscoderException: null
Enclosed Exception:
The current document is unable to create an element of the requested type (namespace: http://www.w3.org/2000/svg, name: point).
at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source)
at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)
at com.test.Test.svgToJpg(Test.java:129)
代码:
public static void svgToJpg(String src, String dest)
FileOutputStream jpgOut = null;
FileInputStream svgStream = null;
ByteArrayOutputStream svgOut = null;
ByteArrayInputStream svgInputStream = null;
ByteArrayOutputStream jpg = null;
try
// 获取到svg文件
File svg = new File(src);
svgStream = new FileInputStream(svg);
svgOut = new ByteArrayOutputStream();
// 获取到svg的stream
int noOfByteRead = 0;
while ((noOfByteRead = svgStream.read()) != -1)
svgOut.write(noOfByteRead);
ImageTranscoder it = new PNGTranscoder();
it.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(0.8));
it.addTranscodingHint(ImageTranscoder.KEY_HEIGHT, new Float(2000));
it.addTranscodingHint(ImageTranscoder.KEY_WIDTH, new Float(4000));
jpg = new ByteArrayOutputStream();
svgInputStream = new ByteArrayInputStream(svgOut.toByteArray());
it.transcode(new TranscoderInput(svgInputStream),
new TranscoderOutput(jpg));
jpgOut = new FileOutputStream(dest);
jpgOut.write(jpg.toByteArray());
这个是由于你的svg文件里有一个自定义的节点<point>xxx</<point>,而batik不认它。。
我是用一个比较粗暴的办法,先把svg字符串里的这些自定义节点删掉:
/*** 简易的剔除未定义节点的方法
*
* @param svg 原始svg
* @param nodeName 需要剔除的节点
* @return
*/
public static String cutNode(String svg, String nodeName)
int b, e = 0;
int len = nodeName.length() + 3;
String strB = "<" + nodeName + ">";
String strE = "</" + nodeName + ">";
StringBuilder sb = new StringBuilder();
do
b = svg.indexOf(strB, e);
if (b < 0)
break;
sb.append(svg.substring(e, b));
e = svg.indexOf(strE, b) + len;
while (true);
sb.append(svg.substring(e));
return sb.toString();
svg = cutNode(svg, "point");
/**
* 将svg转换成png格式图片
*
* @param pistrPngFile 图片路径
* @param svgPath svg路径
*/
private void changeSvgToJpg(String pistrPngFile, String pistrSvgPath)
Date date = new Date();
long timeBegin = date.getTime();
// svg文件路径
String strSvgURI;
OutputStream ostream = null;
try
// 根据路径获得文件夹
File fileSvg = new File(pistrSvgPath);
// 构造一个表示此抽象路径名的 file:URI
URI uri = fileSvg.toURI();
// 根据此 URI 构造一个 URL
URL url = uri.toURL();
// 构造此 URL 的字符串表示形式
strSvgURI = url.toString();
// 定义一个通用的转码器的输入
TranscoderInput input = new TranscoderInput(strSvgURI);
// 定义图片路径
String strPngPath = pistrPngFile;
// 输入流
ostream = new FileOutputStream(strPngPath);
// 定义单路输出的转码器
TranscoderOutput output = new TranscoderOutput(ostream);
// 构造一个新的转码器,产生JPEG图像
JPEGTranscoder transcoder = new JPEGTranscoder();
// 设置一个转码过程,JPEGTranscoder.KEY_QUALITY设置输出png的画质精度,0-1之间
transcoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8));
// 转换svg文件为png
transcoder.transcode(input, output);
catch (MalformedURLException e)
e.printStackTrace();
catch (FileNotFoundException e)
e.printStackTrace();
catch (TranscoderException e)
e.printStackTrace();
finally
try
ostream.flush();
// 关闭输入流
ostream.close();
catch (IOException e)
e.printStackTrace();
System.out.println("转换图片成功");
// // 删除svg文件
// fileSvg.delete();
System.out.println(pistrSvgPath + "已删除!");
date = new Date();
long timeEnd = date.getTime();
long time = timeEnd - timeBegin;
System.out.println("耗时" + time + "毫秒");
追问
at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source)at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)报未知来源?SVG小的转换可以成功,SVG编码格式都是UTF-8的。
追答batik-transcoder少包
使用Batik绘制SVG图并保存为png图像格式
SVG(Scalable Vector Graph)--可缩放矢量图形.
可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描写叙述二维矢量图形的一种图形格式。它由万维网联盟制定。是一个开放标准。
思考
使用SVG实现一个miniCAD
參考代码来源http://outofmemory.cn/code-snippet/1096/java-jiang-svg-tupian-switch-png-format-tupian:
package cn.outofmemory.util; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; 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 abstract 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(); } } } } }
编译依赖:
batik-all-1.7.jar xml-commons-external-1.4.01.jar
拷贝上两个jar到classpath或当前文件夹下,编译自己定义程序:
javac -classpath batik-all-1.7.jar XXX.java
程序中调用:convertToPng(tmp_str, outimgfilename);
以上是关于java batik svg转png报错,球大神!!!在线等的主要内容,如果未能解决你的问题,请参考以下文章
使用 Batik 将 svg 转换为图像时出现 TranscoderException
各位大神,怎么把svg格式图片用代码转换成png格式或者jpg格式