背景
有朋友了解了我上篇svg绘制中国象棋棋盘后,想要将其使用代码保存下来,正好今天有时间,顺便给大家介绍一下我的解决方案。
代码
<!DOCTYPE html> <html> <body> <h1>My first SVG</h1> <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red" /> </svg> <br /> <button onclick="svgSave()">Svg保存</button> <button onclick="notSvgSave('jpeg')">Jpeg保存</button> <button onclick="notSvgSave('png')">Png保存</button> </body> </html> <script type="text/javascript"> function svgSave() { let svg = document.querySelector("svg").outerHTML; let src = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svg))); let a = document.createElement("a"); a.href = src; a.download = "result.svg"; a.click(); } function notSvgSave(type) { let svg = document.querySelector("svg").outerHTML; let src = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svg))); let img = document.createElement("img"); img.src = src; img.onload = () => { let canvas = document.createElement("canvas"); let cxt = canvas.getContext("2d"); canvas.width = img.width; canvas.height = img.height; cxt.drawImage(img, 0, 0, img.width, img.height); let url = canvas.toDataURL(`image/${type}`, 1.0); let a = document.createElement("a"); a.href = url; a.download = `result.${type}`; a.click(); } } </script>
复制
解析
svg标签内代码从菜鸟教程第一课中拷贝而来。
svg直接下载方案:将其转为base64码,自建a标签并模拟点击进行下载
svg转jpeg或png再下载方案:将其转为base64码后,自建img标签并设置src为base64码,为img标签加载事件添加处理函数,函数内容为:将img图片绘制到一个自建canvas标签中,并转为jpeg或png的base64码,再自建a标签并模拟点击进行下载
有兴趣深入了解的小伙伴请重点学习 encodeURIComponent、unescape、btoa这三个函数,其使用方法和细节这里不展开赘述。