使用 Scalable Vector Graphics 为 ASP.NET 构建基于 XML 的灵活、轻量的图像

Dennis Forbes

本文假设您熟悉 HTML、ASP.NET 和 C#

下载本文的代码:ScalableVectorGraphics.exe (123KB)

摘要

Scalable Vector Graphics (SVG) 是围绕 XML 建立的 W3C 图形标准,它是使快速轻量图(比如图表和图形)能在适当的查看器上迅速呈现的几种矢量图形技术之一。这样的矢量图形有许多优势,包括节省带宽和存储媒体、灵活性强。本文将解释这些优点,并向您介绍如何轻松地在 Web 应用程序中添加强大、动态和交互式的可视化元素。

Scalable Vector Graphics (SVG) 是使用 XML 文档制作和部署二维矢量图形的一种标准。它是由大量业界组织制订和认可的 WWW 联合会 (W3C) 建议。SVC 具有高质量且丰富的矢量图形、简单性及 XML 基础广泛的工具兼容性,以及功能丰富的文档对象模型 (DOM) 接口的动力,从而为 DHTML 项目带来了强大的新成员。将它与创造力(以及一点别出心裁)相结合,就可以使无数的交互式 Web 可能变为现实,从而改善您的 Web 应用程序的外观、可用性和功能性。

各种矢量图形格式

矢量图形(包括 SVG、矢量标记语言 (VML)、Windows® 图元文件(.wmf 和 .emf)和 TrueType 字体)是以指令列表的形式存储和表述的,这些指令详细描述了如何使用一连串的形状、线和转换来重新创建图像。这种做法好比通过准确记录、然后重新创建原先用来产生绘图的画笔笔划序列来复制该绘图。矢量图形通常数据量很小(特别是当它经过压缩后),所以最大程度地降低了对存储空间和带宽的要求。当它们打印或缩放,甚至是扩大或放大时,都不需要像素化就能呈现。因为允许将它们分解为基本的形状和曲线,所以对于制作精度有限的任何图形是一种很好的选择。但另一方面,因为重新创建一幅图像需要的步骤是数以千计的,所以呈现矢量图形需要的计算量很大。矢量图形一般不适合表示实际拍摄、高度细节化的图像,但通常很适合表示由基本形状组成的图形、图表或者图像(比如卡通风格的图像)。

光栅图形 — 例如可移植网络图形 (PNG)、GIF 和 JPEG — 是通过对以特定的分辨率和缩放比例预先呈现的、最终图像的逐像素的表示方式进行比较而绘制的。这好比等待绘图完成,然后以特定用途和输出设备需要的分辨率和大小将它画下。光栅图像很容易跨平台移植,可以最大程度地降低对计算量的要求。它们用于表示高度细节化的、实际拍摄的图像是很理想的,但通常缩放和打印的效果较差。因为没有对庞大的文件大小进行处理,所以它们的动态可编程性很差,而且通常存储和传输的效率很低。

细心的读者可能已经注意到本部分前面提到的 VML,的确有必要对它进行详细介绍:VML 具备 SVG 的许多同样的优点,如轻松的基于文本制作和根据矢量图形构建的基础。然而,其他格式极为排斥 VML,而 SVG 在去年获得了一些 VML 的矢量图形要素。有工具可以在 SVG 和 VML 之间进行双向转换,所以可以相信经过很小的努力就可以使这两者同时得到支持。

SVG 入门

一个 SVG 实质上是一个 XML 文档,这种文档遵循定义为 SVG 批准进程的一部分的架构。规范中定义的是各种基本几何形状,例如矩形、圆、椭圆、直线、折线、多边形和字形元素(例如文本)。复杂些的形状可以使用路径元素创建,允许您定义诸如一连串直线、弧线和复杂的贝赛尔曲线等形状。使用这些基本形状,外加一点巧妙设计,即使最复杂的几何结构都可以创建出来。图 1 阐述了一个基本的 SVG 文档的 XML 构成,图 2 显示在 SVG 查看器中呈现的 SVG 的样子。

fig02

图 2 查看器中的 SVG

虽然有些应用程序(例如 CorelDraw、Adobe Illustrator 和 Batik SVG 工具集)可以直接显示或处理 SVG,但在大多数情况下,SVG 可以作为 HTML 文档的一种元素使用,与其他 HTML 文本和多媒体内容共存。典型方法是通过原始的嵌入标记加以实现:



A Page Containing an SVG

pluginspage 属性可将用户引向可用的内容处理程序(如果还没安装)。在本示例中,我引用的是 Adobe SVG Viewer。

值得注意的地方是嵌入标记的 width 和 height 属性之间的相关性,对于所引用图形中的根 SVG 元素也是一样(这个值有时会以各种方式表示,包括像素、厘米等等)。如果这些数字不匹配,所封装的图形就会以某种不合要求的方式被裁剪或修改。通常使用的一种可避免这种问题并提供更大的灵活性的技术就是防止将该 SVG 限制为特定的大小。图 3 显示了一个经过稍加修改的 SVG,它使用 viewBox 属性,而不是 width 和 height。它固定了绘画时的画板边界,并因此固定了 width 和 height 之间的比例;然而,它并不固定呈现大小。如果您更改了嵌入元素的 width 和 height,但保持 width 和 height 的相对比例不变,则 SVG 图形就会依此平滑改变大小。

该非标准 HTML 嵌入元素的一种替代方案(特别是当要求与 XHTML 兼容)就是使用对象或 iframe 元素: