• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 绘制SVG内容到Canvas的HTML5应用

绘制SVG内容到Canvas的HTML5应用

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含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格式图片的运行效果:



1052.png

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


1053.png

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

1054.png

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

1055.png

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

以上就是绘制SVG内容到Canvas的HTML5应用的内容,更多相关内容请关注微课江湖()!

您可能想查找下面的文章:

  • 实例讲解使用SVG制作loading加载动画的方法
  • 使用HTML5进行SVG矢量图形绘制的入门教程
  • HTML5新特性之用SVG绘制微信logo
  • 深入浅析HTML5中的SVG
  • 深入解析HTML5使用SVG图像时的viewBox属性用法
  • html5+svg学习指南之SVG基础知识
  • html5中svg canvas和图片之间相互转化思路代码
  • HTML中使用SVG与SVG预定义形状元素介绍
  • HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
  • HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍

相关文章

  • 2017-10-01h5改良的input元素种类
  • 2018-12-03IOS和HTML5,Javascript之间的交互说明
  • 2017-08-06移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
  • 2017-08-06HTML5 Canvas API中drawImage()方法的使用实例
  • 2018-12-03HTML5 可以做微信类产品吗?
  • 2018-12-03详解HTML5中的Communication API基本使用方法_html5教程技巧
  • 2018-12-03HTML5表单验证的解析
  • 2017-08-06针对HTML5的Web Worker使用攻略
  • 2018-12-03HTML5本地存储应用sessionStorage和localStorage
  • 2017-08-06用HTML5实现鼠标滚轮事件放大缩小图片的功能

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • HTML5新特性之WebSocket
    • SVG 与 HTML5 的 canvas 各有什么优点,哪个更有前途?
    • HTML5每日一练之progress标签的应用
    • 响应式和自适应有什么区别
    • Angular-指令总汇
    • React Router中的核心history库的详细分析
    • 移动端浏览器如何自动全屏?
    • 百度钱包ios移动端html5网页无法自动关闭问题
    • HTML5中的<aside>元素与<article>元素 实例详解
    • 前缀data-属性和dataset的使用方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有