SVG:可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。SVG由W3C制定,是一个开放标准。 SVG严格遵从XML语法,并用文本格式的描述性语言来描述图像内容,因此是一种和图像分辨率无关的矢量图形格式。
SVG的特点
1.基于XML
为了保证网络图像能够顺利地和目前已经由W3C开发的D0M1,DOM2,CSS,XML,XPointer,XSLT,XSL,SMIL,HTML,XHTML技术,以及其他标准化技术,如ICC,URI,UNICODE,RGB,ECMAScr ipt/JavaScript,Java协调一致,SVG是完全基于x M L(EXtensibleMarkup Language可扩展置标语言), 并能和上述各项技术相融会的新一代的网络图像格式。SVG并非仅仅是一种图像格式, 由于它是一种基于XML的语言,也就意味着它继承了XML的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步。如SVG可以内嵌于其他的XML文档中,而SVG文档中也可以嵌入其他的XML内容,各个不同的SVG图形可以方便地组合, 构成新的SVG图形。
2.采用文本来描述对象
SVG包括3种类型的对象: 矢量图形(包括直线、曲线在内的图形边)、点阵图像和文本。各种图像对象能够组合、变换,并且修改其样式,也能够定义成预处理对象。
与传统的图像格式不同的是,svG采用文本来描述矢量化的图形,这使得svG图像文件可以像HTML网页一样有着很好的可读性。当用户用图像工具输出svG后,可以用任何文字处理工具打开SVG图像,并可看到用来描述图像的文本代码。掌握了svG语法的人甚至可以只用一个记事本便可以读出图像中的内容来。
svG文件中的文字虽然在显示时可呈现出各种图像化的修饰效果,但却仍然是以文本的形式存在的,可以选择复制、粘贴。由于SVG内的文字都以文本的形式出现在XML文件中, 这些信息可以为搜索引擎所用,而以往搜索引擎通常无法搜索到写在点阵图像中的文字。这些文本信息还可以帮助视力有残疾而无法看到图形的人,可以通过其他方式(如声音)来传送这些信息。
3.具有交互性和动态性
由于网络是动态的媒体,SVG要成为网络图像格式,必须要具有动态的特征,
这也是区别于其它图像格式的一个重要特征。SVG是基于XML的,它提供无可匹敌的动态交互性。你可以在svG文件中嵌入动画元素(如运动路径、渐现或渐隐效果、生长的物体、收缩、快速旋转、改变颜色等),或通过脚本定义来达到高亮显示、声音、动画等效果。
4.完全支持DOM
D0M(Document Object Model文档物件模型)是一种文档平台,它允许程序或脚本动态的存储和上传文件的内容、结构或样式。由于SVG完全支持DOM, 因而SVG文档可以通过一致的接口规范与外界的程序打交道。SVG以及SVG中的物件元素完全可以通过脚本语言接受外部事件的驱动,例如鼠标动作,实现自身或对其他物件、图像的控制等。这也是电子文档应具备的优秀特性之一。
SVG在手机上的应用
由于SVG是基于XML的, 因而能制作出空前强大的动态交互图像。即SVG图像能对用户动作做出不同响应, 例如高亮、声效、特效、动画等。 作为SVG技术的一个应用,SVG在手机等无线手持设备上的应用将是3G时代最重要的应用之一。支持SVG的手机,允许用户查看高质量的矢量图形及动画,同时,由于SVG采用文本传输,尺寸也会非常小,速度将会更快。目前,市面上已经有100多款智能手机提供此服务,其中包括诺基亚、摩托等巨头的产品,由此可见,SVG手机将成为3G时代的一个最重要的市场制高点,也将是国内手机厂商应对和超越海外兵团的一个突破口。
介绍在QT中如何利用DOM来解析SVG文件并根据解析的SVG中绘图元素来绘制图形
SVG文件使用XML表示的矢量图形文件,每种图形都是用XML标签表示,例如在SVG文件中画折线的标签如下:
<polyline fill="none" stroke="red" stroke-width="2" points="100,200,100,100"></polyline>
其中polyline表示画折线,fill属性表示填充颜色,一般用来设置给brush,stroke属性表示画笔的颜色,一般用来设置给pen,stroke-width属性表示画笔的宽度,也用来设置给pen,points表示折线的点。
给出一个比较简单的通过解析SVG文件,获取到绘图元素然后进行图形绘制的例子
SVG文件:
<?xml version="1.0" standalone="no"?>
<svg>
<rect fill="none" stroke="red" stroke-width="2" id="testRect" x="10" y="10" width="50" height="50"></rect>
<circle fill = "#7dff64" stroke="blue" stroke-width="2" cx="70" cy="70" r="10"></circle>
<text stroke="blue" stroke-width="2" x="90" y="90" font-family="arial" font-size="10">liangkaiming</text>
</svg>
解析代码:
将SVG文件数据内容读到QDomDocument对象中:
void Widget::readSvg(QString fileName)
{
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly))
{
return;
}
if(!doc->setContent(&file))
{
f