添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1.遇到需要将svg下载的需求,网上找了一些代码,地址是这个 https://github.com/exupero/saveSvgAsPng ,但是不太好用,莫名的把网页所有的svg都下载了,于是在源码的基础上做了一些小的修改;代码如下所示

var doctype = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [<!ENTITY nbsp " ">]>';
function convertToPng(src, w, h) {
            var canvas = document.createElement('canvas');
            var context = canvas.getContext('2d');
            canvas.width = w;
            canvas.height = h;
            context.drawImage(src, 0, 0);
            var png;
            try {
                png = canvas.toDataURL("image/png");
            } catch (e) {
                if ((typeof SecurityError !== 'undefined' && e instanceof SecurityError) || e.name == "SecurityError") {
                    console.error("Rendered SVG images cannot be downloaded in this browser.");
                    return;
                } else {
                    throw e;
            return png;
        function isElement(obj) {
            return obj instanceof HTMLElement || obj instanceof SVGElement;
        function reEncode(data) {
            data = encodeURIComponent(data);
            data = data.replace(/%([0-9A-F]{2})/g, function (match, p1) {
                var c = String.fromCharCode('0x' + p1);
                return c === '%' ? '%25' : c;
            return decodeURIComponent(data);
        function uriToBlob(uri) {
            var byteString = window.atob(uri.split(',')[1]);
            var mimeString = uri.split(',')[0].split(':')[1].split(';')[0]
            var buffer = new ArrayBuffer(byteString.length);
            var intArray = new Uint8Array(buffer);
            for (var i = 0; i < byteString.length; i++) {
                intArray[i] = byteString.charCodeAt(i);
            return new Blob([buffer], {type: mimeString});
        function downLoad(el, name) {
            if (!isElement(el)) {
                throw new Error('an HTMLElement or SVGElement is required; got ' + el);
            if (!name) {
                console.error("文件名为空!");
                return;
            var xmlns = "http://www.w3.org/2000/xmlns/";
            var clone = el.cloneNode(true);
            clone.setAttribute("version", "1.1");
            if (!clone.getAttribute('xmlns')) {
                clone.setAttributeNS(xmlns, "xmlns", "http://www.w3.org/2000/svg");
            if (!clone.getAttribute('xmlns:xlink')) {
                clone.setAttributeNS(xmlns, "xmlns:xlink", "http://www.w3.org/1999/xlink");
            var svg = clone.outerHTML;
            var uri = 'data:image/svg+xml;base64,' + window.btoa(reEncode(doctype + svg));
            var image = new Image();
            image.onload = function () {
                var png = convertToPng(image, image.width, image.height);
                var saveLink = document.createElement('a');
                var downloadSupported = 'download' in saveLink;
                if (downloadSupported) {
                    saveLink.download = name + ".png";
                    saveLink.style.display = 'none';
                    document.body.appendChild(saveLink);
                    try {
                        var blob = uriToBlob(png);
                        var url = URL.createObjectURL(blob);
                        saveLink.href = url;
                        saveLink.onclick = function () {
                            requestAnimationFrame(function () {
                                URL.revokeObjectURL(url);
                    } catch (e) {
                        saveLink.href = uri;
                    saveLink.click();
                    document.body.removeChild(saveLink);
            image.src = uri;

这里使用的时候只需要调用download方法就可以了,建议封装成一个单独的下载服务;download方法的第一个参数el指的是dom元素,就是svg元素,具体的获取方法通过js或者d3的选择器都可以;例如

<div id="svg-parent-div"><svg>...</svg></div>

一般通过获取svg的父元素来找到它,比如

var el = d3.select("#svg-parent-div").node().children[0];
download(el,"下载图片");

这样就可以了;

代码对于svg的没设置命名空间的情况做了处理,通过如下代码,如果svg 元素没有 设置命名空间,则添加;

el.setAttributeNS(xmlns, "xmlns", "http://www.w3.org/2000/svg");
el.setAttributeNS(xmlns, "xmlns:xlink", "http://www.w3.org/1999/xlink");

同时,添加的命名空间作用在clone的元素上,不会影响原来的svg元素;

官方地址 https://svgjs.dev/docs/3.1/ 资源版本: @svgdotjs/svg.js v3.1.1 MIT BUILT: Fri Jun 25 2021 15:37:54 GMT+0200 @svgdotjs/svg.filter.js BUILT: Mon Oct 18 2021 15:55:55 GMT+0200
1.遇到需要将svg下载的需求,网上找了一些代码,地址是这个https://github.com/exupero/saveSvgAsPng,但是不太好用,莫名的把网页所有的svg下载了,于是在源码的基础上做了一些小的修改;代码如下所示 var doctype = '<?xml version=1.0 standalone=no?><!DOCTYPE svg PUBLIC -//W3C//DTD SVG 1.1//EN http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd [<!ENTITY nbsp >]>'; functi
SVG(Scalable Vector Graphics,可缩放矢量图形)是基于XML、用于描述二维矢量图形的一种图形格式。SVG由W3C制定,是一个开放标准。 SVG.js中包含了大量用于定义动画的方法,如移动、缩放、旋转、倾斜等,具体可参阅相关演示。 SVG.js中的一些亮点: 易读的简洁的语法 非常轻量,gzip压缩版只有5k 针对大小、位置、颜色等的动画元素 模块化结构,轻松扩展 各种实用插件 各种形状类型间拥有统一的API. 元素可以绑定事件,包括触摸事件 完全支持不透明蒙版 完整的文档记录
async function svg2png(svg, png) { const image = await loadImage(svg) const canvas = createCanvas(image.width, image.height) const ctx = canvas.getContext('2d') ctx.drawImage(image, 0, 0) const buffer = canvas.toBuffer() fs.writeFileSync(png, buffer) svg2png('input.svg', 'output.png') 此代码将“input.svg”文件转换为“output.png”文件。 ### 回答2: SVG是一种可伸缩矢量图形格式,而PNG是一种位图图像格式。如果我们想把SVG文件转换PNG,我们可以使用Node.js来完成。 首先,我们需要安装一些必要的Node.js库。我们可以使用`npm`命令来安装`svg2png`库,这个库可以帮助我们将SVG转换PNG。打开终端窗口,并输入以下命令来安装`svg2png`库: npm install svg2png 安装完成后,我们可以创建一个Node.js脚本来执行转换操作。在脚本中,我们首先需要引入`svg2png`库和`fs`库,`fs`库用于读取和写入文件。然后,我们可以使用`svg2png`库的`convert`方法来执行转换。下面是一个示例代码: ```javascript const fs = require('fs'); const svg2png = require('svg2png'); const svgFilePath = 'path_to_svg_file.svg'; const pngFilePath = 'path_to_output_png_file.png'; fs.readFile(svgFilePath, (err, data) => { if (err) throw err; svg2png(data) .then(buffer => { fs.writeFile(pngFilePath, buffer, (err) => { if (err) throw err; console.log('SVG转换PNG成功!'); .catch(error => { console.error('转换失败:', error); 在上面的代码中,我们首先读取SVG文件,然后使用`svg2png`库的`convert`方法将SVG转换PNG。最后,我们将转换后的PNG图像数据写入到指定的输出文件中。完成后,我们会在控制台输出成功或失败的相关信息。 要使用上述代码进行转换,我们需要将`path_to_svg_file.svg`替换为SVG文件的实际路径,将`path_to_output_png_file.png`替换为要生成的PNG文件的实际路径。执行脚本后,我们将得到一个转换成功的PNG图像文件。 需要注意的是,由于`svg2png`库依赖于Cairo库,因此在使用此方法之前,我们需要确保已经在计算机上安装了Cairo库。 ### 回答3: 使用Node将SVG转换PNG可以通过使用一些库来实现。 首先,你需要安装`svg2png`库。你可以使用npm命令安装它:`npm install svg2png`。 安装完库后,你需要在项目中引入它:`const svg2png = require('svg2png');`。 接下来,你可以使用以下代码将SVG文件转换PNG: ```javascript const fs = require('fs'); fs.readFile('input.svg', (err, data) => { if (err) throw err; // 将SVG数据转换PNG文件 svg2png(data) .then(buffer => { fs.writeFile('output.png', buffer, err => { if (err) throw err; console.log('PNG文件已生成'); .catch(error => { console.error('转换失败:', error); 上述代码中,我们首先使用`fs`模块来读取SVG文件的数据。然后,我们使用`svg2png`函数将SVG数据转换PNG格式的数据。最后,我们使用`fs.writeFile`方法将PNG数据写入文件。 请确保在运行上述代码前,你已经准备好了一份名为`input.svg`的SVG文件。一旦代码执行完成,你将会在项目中看到一个名为`output.png`的PNG文件。 这就是使用Node将SVG转换PNG的简单方法。