java读取svg元素_JavaBatik操作SVG,实现svg读取,⽣成,
动态操作
SVG在现在的应⽤场景中还是很常见的,例如绘制复杂的⽮量图形。说到SVG,就不得提下Canvas。在这⾥我就不详细列举它们之间的不同之处,以及为什么要选择SVG或Canvas了。
⾸先,我的项⽬是⼀个Maven项⽬,所以只需要导⼊batik的maven依赖就可以了,如果是普通的Java项⽬,就需要⾃⼰jar包导⼊项⽬中了。maven依赖有:
batik
batik-svggen
1.6
batik
batik-awt-util
1.6
batik
batik-bridge
1.6
batik
batik-css
1.6
batik
batik-dom
1.6
batik
batik-gvt
1.6
batik
batik-parser
1.6
batik
batik-script
1.6
batik
batik-svg-dom
1.6
batik
batik-transcoder
1.6
batik
batik-util
1.6
batik
batik-xml
1.6
xerces
xercesImpl
2.5.0
svg图形xml-apis
xmlParserAPIs
2.0.2
w3c.dom.svg
svg-dom-java
1.1
xml-apis
xml-apis
2.0.0
org.w3c.css
sac
1.3
这个地⽅⼤致是需要这么多jar包依赖,我主要使⽤batik操作svg导出png或jpg,所以最主要的jar包是batik-transcoder,其实只要导⼊这⼀个jar包就够了,因为其他的jar包都会被依赖。这⾥有多或少了的或错误的,请指明。
batik操作svg,⾸先要知道batik为我们做了什么事:
batik是为想使⽤svg格式图⽚来实现各种功能的应⽤程序和Applet提供的⼀个基于java的⼯具包。
⼯程创建的⽬的是为开发者提供⼀系列可以结合或单独使⽤来⽀持特殊的svg解决⽅案的核⼼模块。模块主要
有 SVGParser,SVGGernerator,SVGDOM。Batik⼯程的其他⽬的是使它具有⾼度的扩展性----举个例⼦,Batik允许开发者使⽤⾃定义的SVG元素。即使⼯程的⽬标是提供⼀系列核⼼模块,但是还是提供了⼀个完整的SVG浏览器,以便证实各个模块的有效性和交互性。
上⾯这段话是batik官⽹给出对batik的⼀个简单的概述。我们通过这段话能够理解到,batik其实就是将对svg的操作分为了⼀个个核⼼模块,这主要包括SVGParser(解释器),SVGGernerator(⽣成器),SVGDOM(DOM元素)。通过字⾯的意思我们就能知道batik的主要核⼼模块为我们做了什么事。SV
GParser解释器主要是对SVG的xml⽂件节点的解析,SVGGernerator(⽣成器)可以通过⽣成⼀个svg⽂
件,SVGDOM能够建⽴SVGDOM节点,并在每⼀个Element上添加不同的属性。
通过Batik,你可以在任何使⽤到java的地⽅操作SVG⽂档。你也可以使⽤各种Batik模块来在你的应⽤程序和Applet中来⽣成,操作和转换你的svg图像。
batik使通过java处理SVG内容变的简单。举个例⼦,通过使⽤batik的SVGGernerate模块,java应⽤程序和Applet可以⾮常简单的使输出图像的格式为SVG。使⽤batik的SVG viewing component, 应⽤程序或者Applet可以⾮常容易的整合SVG查看和交互功能。另外还可以使⽤Batik的模块将SVG转换为其他格式,⽐如说JPEG等图像格式和PDF等其他向量格式。
上⾯这段话也是官⽹batik对batik的⼀个⽤途的解释。⾸先我们选择⼀门语⾔,或是⼀种技术,必须要知道⾃⼰想要做什么,这门技术或⼯具能不能达到⾃⼰的需求,能不能解决现有的问题。选择好⼀种技术后,不是急着就拿着代码⽤,⽽是先要慢慢的去了解它,我承认,我也不是很了解batik,甚⾄说对它还不算了解。因为我也仅仅是停留在使⽤它的层次上。但是我们可以以点划线,再以线画⾯。
先贴代码,然后进⾏解释:
public class SvgPngConverter {
/**
* batik通过读取svg⽂件的⽅式转png
* @param filePath 传⼊读取的svg⽂件
* @param pngFilePath 转换后的png图⽚
* @param map 更改svg属性的集合 传值规则,id,name,value 主要是更改svg⼦节点的颜⾊属性值。
* 如果需要改变svg的多个element的颜⾊属性 则命名规范为 id1,name1,value1,id2,依次类推
* @throws IOException
* @throws TranscoderException
*/
public static void convertToPngByFile(String filePath, String pngFilePath,Map map)
throws IOException, TranscoderException {
File file = new File(pngFilePath);
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
convertToPngByFile(filePath, outputStream,map);
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void convertToPngByFile(String path, OutputStream outputStream,Map map) throws TranscoderException, IOException {
try {
File file = new File(path);
String parser = XMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
Document doc = f.URI().toString());
for (int i = 1; i <=map.size()/3; i ) {
Element e = ('id' i));
System.out.('name' i));
e.('name' i), ('value' i));
}
PNGTranscoder t = new PNGTranscoder();
TranscoderInput input = new TranscoderInput(doc);
TranscoderOutput output = new TranscoderOutput(outputStream);
outputStream.flush();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
通过上⾯⼀段代码,可以看到我要做的是将⼀个SVG导出成PNG格式化的图像,并输出。⾸先上⾯的
⽅法只是创建⼀个⽂件,只是输⼊了要输出图⽚的地址,还有要读取的SVG⽂件地址,后⼀个map参数主要是为了后⾯操作SVG的DOM元素做准备的,后⾯再说。下⼀个⽅法⼀开始也是创建⼀个⽂件流,此处是⽤来读取SVG⽂件,后三段代码主要作⽤是从⼀个SVG创建⼀个DOM元素,意思是将读取的SVG⽂件,转换成⼀个拥有传⼊的SVG⽂件所有Element节点内容的Document对象。下⾯是⼀个循环,这个循环我主要做的是通过定义map的键值,主要放⼊id,svg节点属性(也可以是dom元素,⽐如style,class),最后就是节点属性的值。这样我们就能控制Document对象的Element元素,以达到动态改变SVG内容的⽬的。batik可以将⼀个SVG转换成PNG,主要是PNGTranscoder的transcode⽅法完成的,具体怎么完成的我们不需要去关系,这⾥我们只关⼼它需要怎样的参数,第⼀个参数是TranscoderInput对象,这个对象需要传⼊⼀个值,我做的⽅法是传⼊⼀个SVGDocument对象,因为我们需要动态的改变原SVG⽂件的属性,并⽣成改变后的PNG图⽚。如果你不需要动态改变SVG的输出,你只需要将传⼊的SVG⽂件流传⼊TranscoderInput对象就可以了,这⾥可以通过查看batick的TranscoderInput类的API就很好了解了。第⼆个参数是TranscoderOutput对象,对象的名称我们就知道它的作⽤是什么了,它需要⼀个之前传⼊的创建好的输出图⽚流。最后transcode⽅法就能将SVG转换成PNG。
上⾯这段代码只是简单的应⽤了SVG转换图⽚这⼀个核⼼模块功能,batik还有很多核⼼功能模块我都没有⽤到,但是常见的⽤法就是上⾯那⼀点点,希望能对刚接触的⼈⼀点点帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论