java 读取svg元素_Java Batik操作SVG,实现svg读取,生成,动态操作_陈宇卿的博客-程序员秘密

技术标签: java 读取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

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,Map map)

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,Map map)

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36383576/article/details/114889750

智能推荐

makefile 指定库的路径_帥氣的胖紙鍋的博客-程序员秘密_makefile指定动态库路径

makefile 指定库的路径现有libmad交叉编译后安装于:/home/andy/share/libmad_install目录现在应用程序miniplayer位于:/home/andy/share/mini_player目录mini_player中的makefile里,怎么指定libmad库和mad.h头文件的路径呢?指定 头文件用 -I /home/andy/sh

ORA-01652_iteye_5745的博客-程序员秘密

ORA-01652: 无法通过 128 (在表空间EAS_T_XY1031_STANDARD 中) 扩展 temp 段临时表空间小了,没自动增长,执行大的查询的时候就会报错,一般在序时簿打开的时候,设置一个新的表空间替换掉默认表空间即可create temporary tablespace TEMP2 TEMPFILE '/oradata/temp02.dbf' SIZE 30...

初来乍到 自我介绍_萱仔加油鸭的博客-程序员秘密

萱仔今天也要加油鸭自我介绍一、菜鸡上路今天刚开通博客,做一下自我介绍吧。我是萱仔 96年的2019年大学毕业,毕业后成功的进入了码农大军。也就是所谓的程序员,我感觉大家都叫程序员,所做的工作,以及工资都是天地之差,下面和大家简单的分享一下我的工作毕业后 我的第一份工作 大数据分析师,业务背景是运营商,技术点用到 mysql-sqoop-hive-mysql 这样的一个流程工作强度不算大 在一个三线城市,每天以完成工作为主,人也比较安逸。没有什么学习的心 在2020年8月底 做了一个决定,进

gdal命令实操专题——ogrinfo命令(转)_潘达小新的博客-程序员秘密

GDAL——命令使用专题——ogrinfo命令前言GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。这一篇就讲讲常见的CDAL相关命令操作,使用好GDAL的相关命令,能够让你事半功倍。有人会说,现在都可视化操作了,还...

Windows 11 (updated Dec 2021) 简体中文版、英文版(64-bit、ARM64)下载(2022 年 1 月发布)_sysin.org的博客-程序员秘密

Windows 11 (updated Dec 2021) 简体中文版、英文版(64-bit、ARM64)下载(2022 年 1 月发布)

软件开发的五个模型_夏日午后的旋律的博客-程序员秘密_软件开发模型

一、瀑布模型瀑布模型在软件测试工程中占有重要地位,是所有其他模型的基础框架。瀑布模型的每一个阶段都之执行一次,因此是线性顺序的软件开发模式。优点: 缺点:-强调开发的阶段性; -串行,有去无回-强调早期计划及需求调查 ...

随便推点

Windows设备管理器中的错误代码_站长杂谈的博客-程序员秘密_由于设备驱动程序的前一个实例仍在内存中

适用于:Windows 10 Pro released in July 2015,Windows 10 Enterprise released in July 2015,Windows 8概要本文涵盖了 Windows 中由“设备管理器”生成的错误代码。 你可能由于“设备管理器”或其他工具(如 DXDiag)报告了错误代码,而且你不知道如何解决,而访问过这篇文章。在本文中,我们将帮助你找到你的错误代码,并提供你尝试纠正错误可能需要的建议。首先尝试以下步骤:首先,尝试以下任何常见解决方...

【深度学习】参数初始化与Batch Normalization_Swocky的博客-程序员秘密_batchnormalization 参数

一、参数初始化原则参数初始化作为模型训练的起点,决定了模型训练的初始位置。选择的好坏很大程度影响收敛的速度与最终的训练结果。一般来说,参数初始化遵循以下几点要求:不建议同时初始化为一个值,容易出现“对称失效”最好保证均值为0,正负交错,参数大致数量相等初始化参数不要太大或太小,前者会导致梯度发散难以训练,后者会导致特征对后面的影响逐渐变小二、常见的初始化方法1、全零初始化与随机初始...

知乎 android自定义view,ChangeThemeForAndoird: 为Android应用设置主题,而不用重新运行Activity,例如可以无闪屏的切换日间、夜间模式,类似于知乎App..._天华建筑的博客-程序员秘密

Android主题切换精简库以简单的方式实现日间、夜间模式。一、使用方式1.1 自定义属性1.2 在布局中使用自定义属性设置View的背景、文本颜色等属性activity_main.xml中的布局:xmlns:tools="http://schemas.android.com/tools"android:id="@+id/root_view"android:layout_width="match_...

【前端趋势】Vue、Vite作者尤雨溪前端趋势2022主题演讲_codeMak1r.小新的博客-程序员秘密_前端分享主题

欢迎来到我的博客【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏最新专栏。

pytorch 之 __call__, __init__,forward_血_影的博客-程序员秘密

要学习pytorch,一个前提是 知道python calss中的__call__和__init__方法.简单的说就是:__init__: 类的初始化函数,类似于c++的构造函数 __call___: 使得类对象具有类似函数的功能。__init__比较好理解,现在主要看一下 __call__的功能示例:class A(): def __call__(self): ...

springboot+vue实现滑块验证登入_幽灵邀请函的博客-程序员秘密_springboot滑块

1、功能效果演示2、技术涉及1、登入模块,前后端分离,通过axios进行代理请求整体基于springboot+vue+shiro实现2、cli 3.4.1+vue 2.5.23、主要逻辑代码登入页面&lt;template&gt; &lt;div class="login-wrap"&gt; &lt;div class="ms-title"&gt;网欲音乐 后台管理登录&lt;/div&gt; &lt;div class="ms-login"&gt; &

推荐文章

热门文章

相关标签