`
yydcj
  • 浏览: 61557 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用Batik开发SVG应用程序(一)

    博客分类:
  • SVG
阅读更多

引自http://blog.csdn.net/firefight/archive/2007/02/06/1503099.aspx

使用 Batik 开发 SVG 应用程序

翻译时间 2007-2-6

修订记录 2007-2-23 语言修改

Thierry Kormann
ILOG
Les Taissounières HB2
1681 route des dolines
06560 Valbonne
France
e-mail: tkormann@ilog.fr
fax: +33 4 92 96 61 62
主页 : http://www.ilog.com

关键词 : SVG, Batik, Toolkit, Developing, Applications

摘要

Batik Apache 软件基金会( Apache Software Foundation )开发的一个开源项目。该项目的目标是提供一组核心模块,通过使用这些模块可以实现特定的 SVG 解决方案。本文将介绍如何使用 Batik 组件开发具有 SVG 功能的 JavaTM 应用程序。

介绍

Batik 是基于 JavaTM 技术的工具集,用于使用 Scalable Vector Graphics (SVG) [1] 图像的应用程序,其功能范围包括图像显示、生成和操作。工具集提供了一组核心模块,包括:

  • SVG 文档对象模型的实现( SVG DOM, W3C/SVG 工作组定义的标准应用程序接口),用于其生成和操作 SVG 内容;
  • transcoder 模块能够将 SVG 文档转换为光栅图像;
  • JSVGCanvas 模块,一个 swing 组件,可以用于渲染静态或动态的 SVG 内容。

本文的目的是介绍如何使用 Batik 组件开发具有 SVG 功能的 JavaTM 应用程序。文章包括三个部分。第一部分介绍在应用程序中如何创建和操作 SVG 内容。第二部分描述如何将 SVG 图像转换为其它图像格式,例如 JPG PNG 。最后一部分介绍如何在 JavaTM 应用程序中增加 SVG 显示功能。

使用 Batik 创建 SVG 内容

Batik 提供了两个模块创建或操作 SVG 内容,两个模块可以单独或组合使用。其中 SVG Generator 模块 能够以 SVG 格式输出图像,而 SVG DOM 的实现提供了操作 SVG 内容的标准 API

SVG Generator 模块

JavaTM 平台中,所有的渲染操作通过 java.awt.Graphics2D 抽象类完成,类中提供了 drawRect fillRect drawString 等操作。不同类型的显示输出有其特定的具体实现,例如对显示器和打印机输出。 JavaTM 平台将根据渲染操作的上下文自动选择使用何种具体的实现。因此,开发人员仅仅需要关注 Graphics2D 抽象类中的一般 API

Batik 工具集中提供了一个新的 Graphics2D 实现类,名为 SVGGraphics2D 。在 SVGGraphics2D 中实现的 Graphics2D 一般 API 用于生成 SVG 内容,而不是输出到显示器或打印机。换一种说法,每当 JavaTM 调用一个渲染方法,例如 drawRect SVGGraphics2D 将生成对应的 SVG 内容(在此为一个 <rect> 元素)并追加到 DOM [2] 树中。最终,一系列渲染操作生成的 DOM 树表达了开发人员创建的图形,图形内容与其它实现完全一致,唯一的不同是用 SVG 描述的。下图(图 1 )显示了 SVGGraphics2D DOM 树之间的关系。


1: SVG Generator 模块架构图

为了说明 SVG Generator 是如何工作的,下面的例子演示如何创建 SVGGraphics2D 实例,并且象使用常规 Graphics2D 对象一样绘制图形。之后演示了如何输出生成的 DOM 树( DOM 树不仅仅是 SVG 文档在内存中的表示,同时也是图形的内存表示)。

 

import java.awt.Rectangle;

import java.awt.Graphics2D;

import java.awt.Color;

import java.io.Writer;

import java.io.OutputStreamWriter;

import java.io.IOException;

 

import org.apache.batik.svggen.SVGGraphics2D;

import org.apache.batik.dom.GenericDOMImplementation;

 

import org.w3c.dom.Document;

import org.w3c.dom.DOMImplementation;

 

public class TestSVGGenerator {

 

    public void paint(Graphics2D g2d) {

         g2d.setPaint(Color.red);

        g2d.fill(new Rectangle(10, 10, 100, 100));

    }

 

    public static void main(String [] args) throws IOException {

        // Get a DOMImplementation

        DOMImplementation domImpl =

            GenericDOMImplementation.getDOMImplementation();

        String svgNamespaceURI = "http://www.w3.org/2000/svg";

 

        // Create an instance of org.w3c.dom.Document

        Document document =

            domImpl.createDocument(svgNamespaceURI, "svg", null);

 

        // Create an instance of the SVG Generator

        SVGGraphics2D svgGenerator = new SVGGraphics2D(document);

 

        // Render into the SVG Graphics2D implementation

        TestSVGGenerator test = new TestSVGGenerator();

        test.paint(svgGenerator);

 

         // Finally, stream out SVG to the standard output using UTF-8

        // character to byte encoding

        boolean useCSS = true; // we want to use CSS style attribute

        Writer out = new OutputStreamWriter(System.out, "UTF-8");

        svgGenerator.stream(out, useCSS);

    }

}

综上所述, SVG Generator 能够以 SVG 格式输出图形。采用 SVGGraphics2D 类的应用程序不需要修改任何图形代码,简单的用 SVGGraphics2D 实例代替内建的 Graphics2D 实现就可以了。

使用 SVG Generator ,开发人员可以访问生成的 DOM 树以便进一步操作它,或者直接将其内容写入一个输出流。 SVGGraphics2D 类可以以很多方式进行定制。例如,用户可以选择自己需要的风格生成方式(使用 style 属性或 XML 表达属性),他们还可以改变 SVG 文档的大小,或者扩展生成器以支持定制的图形格式。更多关于 SVG Generator 的内容请参见 Batik SVG Generator Tutorial [3]

 

SVG 文档对象模型

“文档对象模型是一个与平台和语言无关的接口,通过该接口,程序和脚本能够动态访问和更新文档内容、结构和风格。文档可以被进一步处理,处理结果能够与当前显示的页面合成。这就是对 W3C WEB 中的 DOM 相关技术的概述。

-- DOM 工作组 (W3C)

SVG 中, DOM 用于在内存中描述一个 SVG 文档。它是用于创建和操作 <rect> <cirle> 等元素的标准 API SVG 工作组设计了 DOM 的扩展,称为 SVG DOM SVG DOM SVG 规范的一部分,提供了与 SVG 相关的额外的操作,帮助 SVG 开发人员完成诸如处理几何体或图形对象,得到字符串长度,或取得一个属性变化值等操作。

Batik 提供了一个 SVG DOM 的实现,可以用于 SVG 内容的创建和操作。在 Batik1.5beta2 版本中实现了所有 DOM 特性,并支持一部分 SVG DOM 功能。下面的例子说明如何得到 Batik SVG DOM 实现。

import org.w3c.dom.DOMImplementation;

import org.apache.batik.dom.svg.SVGDOMImplementation;

 

DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();

通过 DOMImplementation 能够创建一个 Document 。下面的例子说明如何使用 createDocument 方法创建 SVG 文档,其输入参数中包括 SVG 名字空间 URI SVG 根元素名称。

import org.apache.batik.dom.svg.SVGDOMImplementation;

import org.w3c.dom.Document;

 

DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();

String svgNS = "http://www.w3.org/2000/svg";

Document doc = impl.createDocument(svgNS, "svg", null);

最后,通过 Document 对象,开发人员能够创建 SVG 内容。尽管 Batik DOM 实现是一个针对 SVG DOM 的实现,但是也能够支持一般的 XML 文档。下例中在 (10, 20) 处创建了一个大小为 (100, 50) 的红色矩形。

 

import org.apache.batik.dom.svg.SVGDOMImplementation;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

 

DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();

String svgNS = "http://www.w3.org/2000/svg";

Document doc = impl.createDocument(svgNS, "svg", null);

 

// get the root element (the svg element)

Element svgRoot = doc.getDocumentElement();

 

// set the width and height attribute on the svg root element

svgRoot.setAttributeNS(null, "width", "400");

svgRoot.setAttributeNS(null, "height", "450");

 

// create the rectangle

Element rect = doc.createElementNS(svgNS, "rect");

rect.setAttributeNS(null, "x", "10");

rect.setAttributeNS(null, "y", "20");

rect.setAttributeNS(null, "width", "100");

rect.setAttributeNS(null, "height", "50");

rect.setAttributeNS(null, "style", "fill:red");

 

// attach the rectangle to the svg root element

svgRoot.appendChild(rect);

生成的 SVG 内容如下:

<svg width="400" height="450">

    <rect x="10" y="20" width="100" height="50" style="fill:red"/>

</svg>

最后, Batik 提供了几个使用 SVG DOM 树的方法。下列两个模块可以用于渲染 SVG 文档, Transcoder 模块(见“使用 Batik 渲染 SVG 内容”一节)和 JSVGCanvas 模块(见“使用 Batik 创建 SVG 应用程序”一节)。

使用 Batik 渲染 SVG 内容

Batik 工具集提供了一个 Transcoder 模块,其中 ImageTranscoder 类能够将 SVG 文档转换为 PNG JPG 格式的光栅图像。 TranscoderInput 类和 TranscoderOutput 类分别对应转换的输入数据和输出数据。 Transcoder 支持几种不同的输入方式,例如 InputStream Document Reader ,以及不同的输出方式如 OutputStream Writer 下面使用 PNGTranscoder 演示如何将一个 SVG 文档转换为 PNG 图像。

import java.io.*;

import org.apache.batik.transcoder.image.PNGTranscoder;

import org.apache.batik.transcoder.TranscoderInput;

import org.apache.batik.transcoder.TranscoderOutput;

 

// Create a PNG transcoder

PNGTranscoder transcoder = new PNGTranscoder();

 

// Create the transcoder input

String svgInputURI = ...;

TranscoderInput input = new TranscoderInput(svgInputURI);

 

// Create the transcoder output

OutputStream ostream = ...;

TranscoderOutput output = new TranscoderOutput(ostream);

 

// Transform the svg document into a PNG image

transcoder.transcode(input, output);

 

// Flush and close the stream

ostream.flush();

ostream.close();

开发人员可以通过 TranscodingHints 类控制所转换 SVG 文档的渲染方式(例如使用的 CSS 媒体或 CSS 替代风格页),以及转换结果图像的不同选项(例如 JPG 的编码质量,图像格式的背景色是否支持透明,或图像大小)。为了设置或改变转换选项,用户应创建新的 TranscodingHints 对象并传给 ImageTranscoder 。如果只需要设置少量选项,可以通过 ImageTranscoder 类的 addTranscodingHint 方法完成。例如可以使用 JPEGTranscoder 设置 JPG 的编码质量:

// Create a JPG transcoder

JPEGTranscoder transcoder = new JPEGTranscoder();

transcoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8));

// ...

下面的代码能够控制图像的大小,并可以在所有类型 ImageTranscoder 中使用:

// Create an ImageTranscoder

ImageTranscoder transcoder = new ...;

transcoder.addTranscodingHint(ImageTranscoder.KEY_WIDTH, new Integer(100));

此外, ImageTranscoder 也可以用于处理动态 SVG 内容。用户可以选择转换选项 KEY_EXECUTE_ONLOAD 以保证 SVG 文件渲染处理完成。渲染可以在 onload 事件派发之前或之后进行, onload 事件处理函数将在渲染前执行。因此,脚本可以在 SVG 内容渲染前对内容进行修改。下例中演示了一个简单的动态 SVG 文档,其结果图像见图 2

<?xml version="1.0" standalone="no"?>

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"

  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">

<svg xmlns="http://www.w3.org/2000/svg"

     xmlns:xlink="http://www.w3.org/1999/xlink"

     width="300" height="300" viewBox="0 0 300 300">

 

    <script type="text/ecmascript"><![CDATA[

    function build(evt) {

        var document = evt.target.ownerDocument;

        var svgNamespaceURI = "http://www.w3.org/2000/svg";

        var e = document.createElementNS(svgNamespaceURI, "rect");

        e.setAttributeNS(null, "x", "50");

        e.setAttributeNS(null, "y", "50");

        e.setAttributeNS(null, "width", "200");

        e.setAttributeNS(null, "height", "200");

        e.setAttributeNS(null, "style", "fill:crimson");

        evt.target.appendChild(e);

    }

   ]]></script>

   <g onload="build(evt)" />

</svg>


2: 'onload' 事件派发后的结果图像

// Create an ImageTranscoder

ImageTranscoder transcoder = new ...;

transcoder.addTranscodingHint(ImageTranscoder.KEY_EXECUTE_ONLOAD, Boolean.TRUE);

// ...

总结一下, transcoder 模块中提供了从 SVG 文档转换为其它格式的 API ImageTranscoder

分享到:
评论

相关推荐

    Eclipse 的svg插件batik-plugin

    Batik是为想使用svg格式图片来实现各种功能的应用程序和Applet提供的一个基于java的工具包。 工程创建的目的是为开发者提供一系列可以结合或单独使用来支持特殊的svg解决方案的核心模块。模块主要有SVGParser,...

    Batik详细教程

    Batik 是为想使用 svg 格式图片来实现各种功能的应用程序和 Applet 提供的一个基于 java 的工具包。 工程创建的目的是为开发者提供一系列可以结合或单独使用来支持特殊的 svg 解决方案的核心模块。模块主要有 ...

    基于Batik的java客户端程序

    Java本身并不原生支持SVG,但通过引入Batik库,我们可以让Java应用程序具备处理SVG的能力。 Batik通过提供一套API,使得开发者可以方便地将SVG图像集成到Java GUI中,或者在Java应用中动态生成SVG内容。 **使用...

    svg_jar Batik

    Batik的目标是使SVG成为Java应用程序和小程序中的主流图形格式,用于查看、操纵或生成SVG内容。它包含了一系列的模块,支持SVG的解析、渲染、转换以及生成。 **SVG解析** 在Batik中,是通过`SVGParser`实现的。这个...

    org.apache.batik包

    总之,Apache Batik是Java开发SVG图形的强大工具,它为开发者提供了丰富的API和实用工具,使得处理SVG内容变得简单且高效。无论是创建动态SVG图形、将现有内容转换为SVG,还是在Java应用中嵌入SVG视图,Batik都是一...

    batik-1.13.rar

    Batik是Apache软件基金会开发的一个开源项目,主要目标是...此外,由于SVG是开放标准,因此使用Batik开发的应用程序具有跨平台兼容性和长期的可维护性。对于需要处理SVG图像的Java项目, Batik是一个不可或缺的工具。

    batik框架 jar包

    这使得开发者可以在Java应用程序中嵌入SVG图像,或者通过Web服务动态生成SVG图像。 3. **SVG到其他格式转换**: Batik框架提供了一种将SVG图像转换为其他格式的能力,如将SVG转换为常见的位图格式(如PNG、JPEG),...

    史上最全的SVG例子

    使用Batik开发SVG应用程序_阿生空间.mht`、`Batik(四)---3-涛涛 - 新浪BLOG.mht`:这些MHT文件是关于SVG和Batik技术的文章或教程, Batik是Apache软件基金会的一个项目,提供了一套处理SVG的工具集,包括将SVG转换为...

    batik源码(包含sample)

    3. **Web应用程序**: Batik可以与Servlet容器集成,用于动态生成和处理SVG图像。 4. **插件支持**: Batik还可以作为浏览器插件,使得老旧的浏览器也能支持SVG内容。 **总结** Batik是一个强大的SVG处理库,它...

    基于SVG的SCADA监控画面生成软件的设计与开发

    IEC 61970是一个国际标准,它规定了能量管理系统应用程序接口的公共信息模型(CIM)以及基于XML的数据交换格式。IEC 61970标准的推出促使SCADA系统朝向标准化、规范化发展。在SCADA系统中,图形系统软件作为人机交互...

    SVG转EMF的示例代码

    如果你在Windows环境中需要处理SVG图形,并希望在其他应用程序(如Word、PowerPoint)中保持矢量特性,这个转换工具将会是一个有效的解决方案。 总的来说,掌握SVG和EMF的转换技术,意味着你能够在跨平台的应用场景...

    batik-1.5-fop-0.20-5.zip batik-1.5-fop-0.20-5.jar

    Apache Batik是一个开源的SVG(Scalable Vector Graphics)工具包,由Apache软件基金会开发。SVG是一种基于XML的矢量图形语言,用于在Web上创建和显示复杂的图形。Batik提供了完整的SVG生态系统,包括解析器、渲染...

    batik的相关jar包

    在Java开发中,Batik是一个非常重要的开源工具包,它由Apache软件基金会提供,主要用于处理SVG(Scalable Vector Graphics)格式的图像。SVG是一种基于XML的矢量图形标准,它允许开发者创建高质量、可缩放的图形,...

    batik .jar 与设计模式

    Batik的核心功能包括将SVG文档转换为其他格式(如PDF、PNG等),在Java AWT或Swing应用程序中嵌入SVG内容,以及创建动态SVG图形。在网页上实现可缩放的图表,Batik能够很好地支持,因为它允许开发者在JavaScript中...

    SVGEditor1.3源代码

    学习和分析SVGEditor1.3的源代码可以帮助我们深入理解SVG图形的处理流程,了解如何利用Java和Batik库构建这样的应用程序。这对于开发自己的SVG编辑器或者扩展现有SVG工具具有很高的价值。此外,源代码研究也能提升对...

    svg-android,安卓SVG矢量图形支持.zip

    SVG(Scalable Vector Graphics)是一种基于XML的矢量图像格式,它允许在网页和应用程序中创建和显示复杂的图形,而这些图形无论放大多少倍都能保持清晰无损。在Android平台上,由于原生系统对SVG的支持有限,开发者...

    svg.rar_SVG java_svg_手机 视频_手机游戏处理_手机视频

    通过Batik,开发者可以在Java应用程序中创建、编辑和显示SVG图像,这在手机游戏的图形界面设计和动态图形生成中非常有用。 在手机视频开发中,SVG可以用于创建复杂的动画效果和图形过渡,提高视频的视觉吸引力。...

    使用Java创建图形绘制应用程序 - 一个实战教程

    在本教程中,我们将学习如何使用Java编程语言和Java Swing库创建一个图形绘制应用程序。这个应用程序将提供用户绘制、编辑和保存图形的功能,涵盖以下核心知识点: 1. **Java Swing库**:Java Swing是Java GUI...

Global site tag (gtag.js) - Google Analytics