如何使用 canvg.js 和 Canvas 将 SVG 导出为 PNG

Posted

技术标签:

【中文标题】如何使用 canvg.js 和 Canvas 将 SVG 导出为 PNG【英文标题】:How to export SVG as PNG using canvg.js and Canvas 【发布时间】:2021-06-10 12:23:11 【问题描述】:

我们正在尝试使用 canvg.js 将 SVG 图片导出为 PNG,但是当我们单击按钮 “截屏” 时,控制台显示错误 “vue.runtime.esm.js? 2b0e:619 [Vue 警告]:v-on 处理程序中的错误:“ReferenceError:未定义 SVG2PNG””。这是调用函数“tipka()”的按钮,我按照这个例子:“https://jsgao0.wordpress.com/2016/06/02/export-svg-as-png-使用-canvg-js-and-canvas/"。

<input id='downloadBtn' @click="tipka()" type='button' style="margin-top:500px; position:absolute" value='Download'/>

这是脚本文件:

import Canvg from "canvg";

export default 
  methods: 
    SVG2PNG(svg, callback) 
      var canvas = document.createElement("canvas"); // Create a Canvas element.
      var ctx = canvas.getContext("2d"); // For Canvas returns 2D graphic.
      var data = svg.outerhtml; // Get SVG element as HTML code.
      canvg(canvas, data); // Render SVG on Canvas.
      callback(canvas); // Execute callback function.
    ,
    generateLink(fileName, data) 
      var link = document.createElement("a");
      link.download = fileName;
      link.href = data;
      return link;
    ,

    tipka() 
      var element = document.getElementById("svg-01"); // Get SVG element.
      SVG2PNG(element, function (canvas) 
        // Arguments: SVG element, callback function.
        var base64 = canvas.toDataURL("image/png"); // toDataURL return DataURI as Base64 format.
        generateLink("SVG2PNG-01.png", base64).click(); // Trigger the Link is made by Link Generator and download.
      );
    ,
  ,
;

【问题讨论】:

【参考方案1】:

您不需要将 SVG2PNG 放在导出的方法对象中(实际上,在这种情况下,您不应该只使用 SVG2PNG() 来访问它)。

generateLink 也是如此。

相反,你应该没问题

import Canvg from "canvg";

function SVG2PNG(svg, callback) 
  var canvas = document.createElement("canvas"); // Create a Canvas element.
  var ctx = canvas.getContext("2d"); // For Canvas returns 2D graphic.
  var data = svg.outerHTML; // Get SVG element as HTML code.
  Canvg(canvas, data); // Render SVG on Canvas.
  callback(canvas); // Execute callback function.


function generateLink(fileName, data) 
  var link = document.createElement("a");
  link.download = fileName;
  link.href = data;
  return link;


export default 
  methods: 
    tipka() 
      var element = document.getElementById("svg-01"); // Get SVG element.
      SVG2PNG(element, function (canvas) 
        // Arguments: SVG element, callback function.
        var base64 = canvas.toDataURL("image/png"); // toDataURL return DataURI as Base64 format.
        generateLink("SVG2PNG-01.png", base64).click(); // Trigger the Link is made by Link Generator and download.
      );
    ,
  ,
;

【讨论】:

我们试过了,但遇到了两个错误,当我们把它放在我们的代码中时,我们得到“TypeError: Cannot call a class as a function”,因为声明了 ctx,但它的值从未读取过。

以上是关于如何使用 canvg.js 和 Canvas 将 SVG 导出为 PNG的主要内容,如果未能解决你的问题,请参考以下文章

JS导出页面为PDF文件,该如何操作?来看一眼就明白啦!

如何将 JButton 与扩展 Canvas 的类一起使用?

如何使用 React 的 Context 功能将 HTML5 Canvas 上下文传递给 this.props.children?

如何将div 转化成 html 5 canvas

如何将canvas轨迹保存为动画

如何使用 HTML2canvas 将图像保存到用户的本地计算机