`
xhload3d
  • 浏览: 209397 次
社区版块
存档分类
最新评论

绘制SVG内容到Canvas的HTML5应用

阅读更多

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

基于HTML5的Drag and Drop生成图片Base64信息》这篇虽然展示的是拖拽普通栅格图片的效果,但你也可以直接拖拽SVG格式的图片进行显示,只不过普通图片的格式数据为data:image/png类型,而SVG格式的数据类型为data:image/svg+xml的类型,下图为该HT for Web拓扑图拖拽入SVG格式图片的运行效果:

Screen Shot 2015-02-01 at 2.20.40 PM

以下一段小例子,展示了加载一个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;
        }            
    };
}

 

Screen Shot 2015-02-01 at 2.21.39 PM

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

Screen Shot 2015-02-01 at 2.21.21 PM

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

Screen Shot 2015-02-01 at 2.21.56 PM

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);
}

 

2
4
分享到:
评论

相关推荐

    svg转img所需 html2canvas方法,svg转canvas所需canvg方法

    - 调用`canvg`方法,传入Canvas元素和SVG数据作为参数,开始在Canvas上绘制SVG。 示例代码: ```javascript var svgElement = document.getElementById('mySVG'); var svgData = svgElement.outerHTML; // ...

    html2canvas(兼容截图svg元素)

    `canvg`是一个专门用来在Canvas上渲染SVG的库,它能够解析SVG文档并将其绘制到Canvas元素上。当`html2canvas`遇到SVG元素时,通过先用`canvg`将SVG渲染到Canvas,然后再让`html2canvas`处理,可以有效地解决SVG截图...

    将svg画布内容转成canvas,转换成png图片下载

    - 一旦SVG内容成功渲染到Canvas,我们可以使用`toDataURL()`方法将Canvas内容转换为Data URL,该URL包含一个表示图像数据的Base64编码字符串。 ``` var dataUrl = canvas.toDataURL('image/png'); ``` 这个Data...

    html5 svg、canvas创建各种图像和填充纹理图片效果

    总结来说,HTML5的SVG和Canvas,配合CSS3的背景技术,为网页开发者提供了强大的图形绘制能力。通过熟练掌握这些技术,开发者能够创建出丰富、动态且具有艺术感的网页图形,提升用户体验。通过探索压缩包中的示例文件...

    canvas2svg:将HTML5 Canvas绘制命令转换为SVG

    Canvas2Svg 该库使用JavaScript将Canvas转换为SVG。 换句话说,该库使您可以使用canvas api构建SVG文档。 为什么要使用它? 您有一个要作为SVG文件保留的画布图形。 您喜欢导出内容。 因为您不想将自定义文件...

    酷炫的svg与canvas结合动画.zip

    - 通过将SVG作为Canvas的图像源,可以在Canvas上绘制SVG图形,同时享受Canvas的动画性能。 - 也可以在SVG中嵌入Canvas,为特定区域提供更灵活的动态渲染。 5. **JavaScript在其中的角色**: - JavaScript是连接...

    canvas+svg实现标尺网格效果

    使用js+canvas绘图,结合svg图形,实现标尺栏和网格效果。

    SVG、CANVAS、VML比较

    然而,CANVAS绘制的图形是像素化的,放大后可能会失真,不具有SVG的可缩放性。 VML(Vector Markup Language)是由Microsoft开发的,主要用于Internet Explorer。VML与HTML兼容,可以在HTML文档中直接嵌入,支持在...

    HTML5 Canvas+SVG实现的彩色水泡分裂动画特效源码.zip

    HTML5 Canvas 和 SVG 是两种强大的Web图形技术,用于在网页上创建动态、交互式的图形内容。这个名为"HTML5 Canvas+SVG实现的彩色水泡分裂动画特效源码"的压缩包,显然包含了一个利用这两种技术制作的动画效果,具体...

    html2canvas.js and html2canvas.svg.js and bluebird.min.js

    HTML2Canvas是一个JavaScript库,它的主要功能是将HTML页面的内容渲染为Canvas图像,进而可以转换成JPEG、PNG或SVG格式的图片。这个技术在网页截屏、数据可视化以及需要保存网页快照的场景中非常有用。它的工作原理...

    HTML5 canvas SVG绘制的仙桃树和祥云卡通动画效果源码.zip

    其中,`canvas`和`SVG`元素是HTML5中用于图形绘制的两大核心技术,它们各自有着不同的特点和应用场景。 `canvas`是HTML5的一个画布元素,允许通过JavaScript动态绘制2D图形。在“HTML5 canvas SVG绘制的仙桃树和...

    html5 svg绘制2020新年快乐主题动画特效

    例如,`&lt;canvas&gt;`元素提供了在浏览器中进行动态图形绘制的能力,而`&lt;svg&gt;`元素则引入了向量图形的支持,使我们可以创建分辨率无关、清晰可缩放的图形。 SVG是一种基于XML的矢量图像格式,它可以精确地控制图形的每...

    Seenjs将3D场景渲染成SVG或HTML5Canvas

    **seen.js 深度解析:3D场景到SVG与HTML5 Canvas的转换** Seen.js 是一个强大的JavaScript库,专为将复杂的3D场景转换为SVG(可缩放矢量图形)或HTML5 Canvas元素而设计。这个库的出现使得在Web上呈现高质量的3D...

    SVG和Canvas绘图:Canvas路径绘制技巧.docx

    SVG和Canvas绘图:Canvas路径绘制技巧.docx

    HTML5 SVG绘制大树.rar

    在这个"HTML5 SVG绘制大树"的例子中,开发者利用SVG元素和属性来构建一棵大树的图形。SVG的基本结构由一系列的图形元素组成,如`&lt;rect&gt;`(矩形)、`&lt;circle&gt;`(圆形)、`&lt;path&gt;`(路径)等。在这个案例中,可能使用...

    实现圆环进度条的三种方式 div svg canvas

    Canvas是HTML5引入的一个绘图元素,可以进行像素级别的操作。虽然实现复杂,但Canvas可以提供高度定制的动态效果。 1. 创建Canvas元素:在HTML中添加canvas标签,并设置宽高。 2. 绘制背景圆环:使用canvas的arc...

    Canvas渲染引擎,支持SVG,兼容了小程序、小游戏和Web.zip

    Cax作为一个Canvas渲染引擎,其核心功能可能是将SVG矢量图转换为Canvas上的像素图,使得SVG的灵活性和可缩放性得以在Canvas环境中应用。这在很多场景下非常有用,例如在小游戏或者性能有限的小程序中,SVG的高质量...

    SVG和Canvas绘图:使用Canvas绘制基本图形.docx

    SVG和Canvas绘图:使用Canvas绘制基本图形.docx

    Android-ChinaMap利用xml解析SVG文件绘制中国省份地图

    4. **绘制SVG图形** 解析完成后,我们可以将SVG图形渲染到`Canvas`上。通常,我们会在一个自定义的`View`类中实现这一功能。在`onDraw()`方法中,获取`Canvas`对象,然后调用`renderSVG()`方法: ```java @...

Global site tag (gtag.js) - Google Analytics