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

xml-apis

xmlParserAPIs

2.0.2

org.axsl.org.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的主要核心模块为我们做了什么事。SVGParser解释器主要是对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,name2,value2....依次类推

* @throws IOException

* @throws TranscoderException

*/

public static void convertToPngByFile(String filePath, String pngFilePath,Mapmap)

throws IOException, TranscoderException {

File file = new File(pngFilePath);

FileOutputStream outputStream = null;

try {

file.createNewFile();

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,Mapmap)

throws TranscoderException, IOException {

try {

File file = new File(path);

String parser = XMLResourceDescriptor.getXMLParserClassName();

SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);

Document doc = f.createDocument(file.toURI().toString());

for (int i = 1; i <=map.size()/3; i++) {

Element e = doc.getElementById(map.get("id"+i));

System.out.println(map.get("name"+i));

e.setAttribute(map.get("name"+i), map.get("value"+i));

}

PNGTranscoder t = new PNGTranscoder();

TranscoderInput input = new TranscoderInput(doc);

TranscoderOutput output = new TranscoderOutput(outputStream);

t.transcode(input, output);

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还有很多核心功能模块我都没有用到,但是常见的用法就是上面那一点点,希望能对刚接触的人一点点帮助。

java batik读取svg_Java Batik操作SVG,实现svg读取,生成,动态操作相关推荐

  1. 使用脚本动态操作 SVG 文档

    本教程适用于那些希望使用可伸缩向量图形(SVG)创建交互式 SVG 图形的开发人员.它讨论了使用ECMAScript(JavaScript)对现有的 SVG 图像进行实时操作得技术. 本文主要介绍在 ...

  2. 使用avaScript脚本动态操作 SVG 文档

    使用脚本动态操作 SVG 文档 陈珂 (chenke@snmobile.com), 技术总监, 南京安元科技 简介: 本教程适用于那些希望使用可伸缩向量图形(SVG)创建交互式 SVG 图形的开发人员 ...

  3. 二维几何变换java代码_基于Batik的SVG应用: 关于几何变换

    本文是作者在 SVGGIS 系统的开发实践过程中关于 SVG 坐标转换的总结.在描述 SVG 坐标变换原理的同时,使用 Apache Batik 项目实现了相关例子. SVG 是一种用 xml 语言来 ...

  4. java 看书浏览器官_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过url预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  5. java 读取浏览器_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过URL预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  6. java用浏览器下载文件_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过url预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  7. java浏览器预览文件_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过URL预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  8. 计算机视觉__基本图像操作(显示、读取、保存)

    计算机视觉__基本图像操作(显示.读取.保存) 本文目录: ✨ 一.前言 ✨ 二.图像显示(使用OpenCV和Matplotlib显示图像) (1).使用OpenCV显示图像 (2).使用Matplo ...

  9. java读取带格式word文档_Java读取word文档解决方案

    java读取word文档时,虽然网上介绍了很多插件poi.java2Word.jacob.itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用):java ...

  10. (五)、JAVA基于OPENXML的word文档插入、合并、替换操作系列之word文件合并[支持多文件]

    (五).JAVA基于OPENXML的word文档插入.合并.替换操作系列之word文件合并[支持多文件] 二.word合并的多种方案简单比较 三.基于Open Xml WordprocessingML ...

最新文章

  1. oracle library cache lock,【案例】Oracle等待事件library cache lock产生原因和解决办法...
  2. 代码改变世界,也改变了我
  3. Memcache应用场景
  4. thincmf 分页无法搜索_分页的bug ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...
  5. airflow 部署
  6. 2021年广东新高考学业水平考试成绩查询,2021年1月广东高中学业水平考试成绩查询时间及入口...
  7. Python爬虫基础之Urllib
  8. win10 忘记登录密码后 修改密码
  9. pp助手苹果版本_pp 助手停止服务/共享 ID 结束,旧版应用还能这样下载
  10. gsp计算机系统内审结论,GSP计算机系统内审表.docx
  11. FAT32 文件系统详解
  12. OA系统选型的那些事儿
  13. 微信小程序农历日期选择器 lunar-picker
  14. button和submit的区别
  15. Vue数据格式化:JSON、HTML、XML数据的格式化显示
  16. 程序员薪酬榜来了!这9类程序员上榜:AI第1 全栈第3,你排第几?
  17. 王垠:Kotlin 和 Checked Exception
  18. 微信视频号怎么变现挣钱?六大变现操作方式。
  19. excel表在html显示图片,html背景图片不显示!如何在Excel里插入背景图片?背景图片可以打印出来吗?...
  20. MATLAB轻松绘制地图路线——已知及未知坐标下的处理方法(2)

热门文章

  1. 用iMindMap制作健康生活计划思维导图
  2. cadsee plus看图纸 7.2.0.1
  3. 抓包工具之fiddler
  4. sp3 win xp 符号表_Windows XP with SP3 各版本全搞定(附序列号)
  5. Windows XP Embedded下载
  6. matlab里用simulink仿真教程,Matlab-Simulink仿真教程课件.ppt
  7. 如何下载谷歌浏览器官方最新离线安装包
  8. turtle画动态时钟
  9. 2018年下半年计算机软件,2018年下半年程序员真题+答案解析(全国计算机软考)上午选择+下午案例完整版.pdf...
  10. 最大功率点跟踪测试软件,最大功率点追踪