HTML5中如何绘制SVG内容到Canvas

SVG与Canvas是HTML5上绘制图形应用的两种完全不同模式的技术,两种绘制图形方式各有优缺点,但两者并非水火不容,尤其是SVG内容可直接绘制在Canvas上的功能,使得两者可以完美的融合在一起,让Canvas可享用到现有丰富的SVG素材,并不失SVG矢量无级缩放的特点。

普通图片的格式数据为data:image/png类型,而SVG格式的数据类型为data:image/svg+xml的类型,下图为该HT for Web拓扑图拖拽入SVG格式图片的运行效果:

以下一段小例子,展示了加载一个SVG图片后,分为七个基本进行缩放绘制的效果,可看出Canvas绘制SVG可保持其矢量不失真的特性

function draw(){
    var img = new Image();
    img.src = 'chart.svg';
    document.body.appendChild(img);
    img.onload = function(){
        var canvas = document.getElementById('canvas');
        var g = canvas.getContext('2d'); 
        var width = img.clientWidth * 1.5;
        var height = img.clientHeight * 1.5;                
        var x = 2;
        var y = 2;
        for(var i=0; i<7; i++){
            g.drawImage(img, x, y, width, height);
            x += width + 2;
            width /= 2;
            height /= 2;
        }            
    };
}

提到Canvas和SVG的融合,我们将采用HT for Web的矢量功能展示一个手机电池充电进度的实例,整个手机电池的静态部分我们通过加载一个简单的SVG素材实现,而充电动态变化的部分,我们采用一个渐进色的HT矩形元素来描述,该矩形的长度通过HT矢量数据动态绑定功能,根据充电进度的百分比换算成长度信息,最后通过定时器模拟数据变化达到动态充电的效果:

ht.Default.setImage('battery', {
    width: 64,
    height: 64,
    comps: [   
        {
            type: 'rect',
            rect: {
                func: function(data){
                    return [5, 25, 50*data.a('percent'), 16]
                }
            },
            background: 'red',
            gradient: 'spread.vertical'
        },                        
        {
            type: 'image',
            name: 'battery.svg',
            relative: true,
            rect: [0, 0, 1, 1]
        }
    ]
});               
var node = new ht.Node();
node.setPosition(80, 150);
node.setImage('battery');
node.s('image.stretch', 'uniform');
node.a('percent', 0);
dataModel.add(node);   
graphView.setEditable(true);
setInterval(function(){
    percent = node.a('percent') + 0.02;
    if(percent > 1){
        percent = 0;
    }
    node.a('percent', percent);
}, 16);

SVG绘制到Canvas还有一种特殊的应用场景,就是将HTML元素通过SVG的foreignObject特性描述在SVG中,然后Canvas绘制SVG时,即可把foreignObject描述的HTML内容绘制到Canvas上,可参见https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas 的实例,其中采用了Blob的方式设置img的src作为URL是比较怪异的技术点,但从上文提到其实我们可以将整个SVG内容转换成data:image/svg+xml;的base64内容即可作为src的url传入,因此我对该例子做了改造,采用btoa(data)把svg内容转换成base64的方式设置img.src,这样方式更容易理解,例子代码和效果如下:http://v.youku.com/v_show/id_XODg0MTU4NjEy.html

function draw(){
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    var data = 。。。;
    var img = new Image();
    img.onload = function () {
        ctx.drawImage(img, 0, 0);
    };            
    img.src = 'data:image/svg+xml;base64,' + btoa(data);
}

HTML 5 中 Canvas 与 SVG 比较

Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的。

SVG

SVG 是一种使用 XML 描述 2D 图形的语言。

SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事件处理器。

在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形。

Canvas

Canvas 通过 JavaScript 来绘制 2D 图形。

Canvas 是逐像素进行渲染的。

在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象。

Canvas 与 SVG 的比较

下表列出了 canvas 与 SVG 之间的一些不同之处。

Canvas

    依赖分辨率
    不支持事件处理器
    弱的文本渲染能力
    能够以 .png 或 .jpg 格式保存结果图像
    最适合图像密集型的游戏,其中的许多对象会被频繁重绘

SVG

    不依赖分辨率
    支持事件处理器
    最适合带有大型渲染区域的应用程序(比如谷歌地图)
    复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)
    不适合游戏应用

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 应用
, 浏览器
, canvas
, 事件
格式
html5 canvas svg、html5 canvas绘制图片、html5 canvas绘制文字、html5 canvas绘制图形、html5 canvas 绘制gif,以便于您获取更多的相关知识。

时间: 2024-11-10 01:03:13

HTML5中如何绘制SVG内容到Canvas的相关文章

html5中文本框输入内容提示消失

例1  代码如下 复制代码 <div><input type="email" name="email" spellcheck="false" placeholder="邮 箱" autofocus tabindex="1" x-webkit-speech></div> <div><input type="password" name=

Web Chart入门(2) Web端图形绘制SVG,VML, HTML5 Canvas简单实例

VML 的用法和实例 引入命名空间之后,就可以直接使用标签的方式绘制图形. 如下例:绘制一条从 坐标(20,20) 到 坐标(200,200) 的直线. <HTML xmlns:v = "urn:schemas-microsoft-com:vml"> <HEAD><TITLE>VML Example</TITLE> <META http-equiv=Content-Type content="text/html; char

HTML5中Canvas(绘制)使用例子

Canvas中不仅可以画线(路径),还能画很多其他的图像,这一章就介绍Canvas的其他两种绘图API. 一.简单图形,整套的属性和方法专门用于绘制矩形: 1.fillStyle可以设置为CSS颜色.一个图案或一种颜色渐变.fillStyle默认是纯黑色,你可以设置成你喜欢的任意颜色.只要页面打开着,每个绘图上下文都会记录自己的属性,除非你重置过它. 2.fillRect(x,y,width,height)绘制一个矩形,并以当前的fillStyle来填充. 3.srtokeStyle和fillS

利用HTML5中的Canvas绘制一张笑脸的教程

今天,你将            学习一项称为Canvas(画布)的web技术,以及它和文档对象模型(通常被称为DOM)的关联.这项技术非常强大,因为它使web开发人员能够通过使用JavaScript访问和修改HTML元素.          现在你可能想知道为什么我们需要大刀阔斧地使用JavaScript.简而言之,HTML和JavaScript是相互依存的,一些HTML组件,如canvas元素,并不能脱离JavaScript单独使用.毕竟,如果我们不能在上面绘图,那canvas能派什么用处呢

探讨SVG图形的基本概念和在HTML5中的使用

可缩放矢量图形 (SVG) 是基于矢量的图形家族的一部分.它们与基于光栅的图形不同,后者在一个数据数组中存储每个像素的颜色定义.如今,网络上使用的最常见的光栅图形格式包括 http://www.aliyun.com/zixun/aggregation/16701.html">JPEG.GIF 和 PNG,每种格式都具有优缺点. 相比任何基于光栅的格式,SVG 具有多项优势: SVG 图形是使用数学公式创建的,需要在源文件中存储的数据要少得多,因为您无需存储每个独立像素的数据. 矢量图形可更

HTML5中Canvas的使用样例(图形增加鼠标点击、拖动交互)

Canvas是一种非保留性的绘图界面,即不会记录过去执行的绘图操作,而是保持最终结果(构成图像的彩色像素). 如果想让Canvas变得具有交互性,比如用户可以选择.拖动画布上的图形.那么我们必须记录绘制的每一个对象,才能在将来灵活的修改并重绘它们,实现交互. 1,鼠标点击选择图形对象 (1)下面样例中点击"添加圆圈"按钮可以在画布上增加位置.大小.颜色都是随机的圆圈. (2)点击"清空画布"按钮可以清除画布上所有圆圈. (3)鼠标点击任意圆圈,该圆圈会出现黑色边框,

html5中canvas的使用 获取鼠标点击页面上某点的RGB

1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> 需要谷歌的一个html5.js的文件即可. 注意:必须插入在<head></he

html5中怎么在canvas中画一个二叉树?

问题描述 html5中怎么在canvas中画一个二叉树? 是否用到递归??????? 具体怎么实现??????? 谢谢 解决方案 用递归就可以画出来 解决方案二: HTML5 canvas画的摇摆的树HTML5开发Canvas递归画树HTML5之Canvas画正方形

关于HTML5中Canvas的宽、高设置有关问题

关于HTML5中Canvas的宽.高设置问题 Canvas元素默认宽 300px, 高 150px, 设置其宽高可以使用如下方法:方法一:1 <canvas width="500" height="500"></canvas>方法二:使用HTML5 Canvas API操作 OK1 var canvas = document.getElementById('欲操作canvas的id');2 canvas.width = 500;3 canva