saveSvgAsPng 将svg转换为图片
曾经有很多次萌发这样的想法,如果有这么一个功能,可以通过调用某个标签里代码,将这些代码在网页中展现的效果保存为图片,那将是多么酷的事。这篇文章介绍一个将页面svg转换为图片的js库—saveSvgAsPng,这个库只有4kb大小,另外通过此库保存的图片不仅仅局限于png格式,你可以通过调用它的函数来设置其他的图片格式。
首先来看下具体的demo吧: saveSvgAsPng应用实例
如何使用它
首先我们需要引入saveSvgAsPng.js,如果只是想下载图片的话,你可以在页面里调用以下函数,它包含三个参数:svg元素、下载的文件名以及下载图片的尺寸比例。
saveSvgAsPng(document.getElementById("diagram"), "diagram.png", 3); |
当然,你也可以通过获取做处理后svg的dataURI,它也有三个参数:svg元素、下载图片的尺寸比例以及一个回调函数,回调函数的参数即为图片的地址:
svgAsDataUri(document.getElementById("diagram"), 1, function(uri) { |
核心代码及原理
其实说来,svg是不能直接转化为图片,必须经过canvas做中间处理,而令人兴奋是canvas是可以直接转换为图片。于是我们可以先将svg的代码转换为字符串,再作为 URI 组件进行编码,然后把编码结果作为图片的src,再加载图片,然后使用canvas渲染这个图片,最后把canvas转换为图片。
var mySvg = document.querySelector(".mysvg"); |
把canvas转换为图片
如你所知,canvas是可以直接渲染图片,建立2d环境,然后使用drawImage传入图片对象即可。而得到图片的data URI只是它的一个反过程而已,这里借助了toDataURL(‘image/png’)函数,它是canvas的一个方法,目的是将当前canvas的内容转化为图片数据。两种过程分别如下:
将图片渲染到canvas中:
image.onload=function(){ |
从canvas中获取图片的data URI
需要说明的是,这样一个地址不是.jpeg、.gif或者png格式的,而是base64格式。我们把这个地址作为一个a标签的链接,并给a标签加入download属性,这是一个html5属性,属性值为下载文件名,这样它就具有被下载的特性。最后将a标签插入到页面,触发点击事件,完成图片下载!
mage.onload=function(){ |
因为函数中用到的大部分内容都是一些html5属性和方法,因此saveSvgAsPng这个库不能支持低版本的IE浏览器。