【问题标题】:Is there a way to render SVG objects on HTML5 Canvas?有没有办法在HTML5画布上呈现SVG对象?
【发布时间】:2018-04-29 18:16:39
【问题描述】:

我的程序动态生成 SVG 对象,我可以通过将它们添加到 DOM 来可视化它们。

我也想在 HTML5 画布上绘制它们,但尽管在网络上搜索失败,但到目前为止还是失败了。对绘制实际源文件的 SVG 的支持很丰富,但就我目前所能找到的而言,不支持动态创建的 SVG。

我的尝试如下代码所示:

// dynamically create an svg containing a black circle
var svgns = "http://www.w3.org/2000/svg";
var svg = document.createElementNS (svgns, "svg");
svg.setAttribute ( "width"  , "128" );
svg.setAttribute ( "height" , "128" );
svg.setAttributeNS ("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");

shape = document.createElementNS (svgns, "circle"); 
svg.appendChild (shape);
shape.setAttribute ( "cx", 64);
shape.setAttribute ( "cy", 64);
shape.setAttribute ( "r",  50);
shape.setAttribute ( "fill", "black");

// add the svg to the DOM
document.body.appendChild (svg); // works

// create a canvas to render the black circle
var canvas = document.createElement ("canvas"); 
document.body.appendChild (canvas);
canvas.width = 300 ; canvas.height = 150 ;
var ctx = canvas.getContext ("2d");
// create an image to contain the svg data
var img = new Image ();
img.onload = function () { ctx.drawImage (this,10,10) }; 

// ATTEMPT 1

var svgURL = new XMLSerializer().serializeToString (svg);
img.src = "data:image/svg+xml; charset=utf8," + encodeURIComponent (svgURL);  // does not work

// ATTEMPT 2

var xml = (new XMLSerializer()).serializeToString (svg);
img.src = "data:image/svg+xml;base64," + btoa (xml); //  also does not work

// ATTEMPT 3

var hiddenDiv = document.createElement("div"); 
hiddenDiv.appendChild (svg.cloneNode(true));
img.src = "data:image/svg+xml;base64," + window.btoa (hiddenDiv.innerHTML); // also deos not work

顺便问一下,如果你问为什么不直接将对象绘制到画布上而不是创建 SVG,那是我也想在 DOM 中使用 svg。

【问题讨论】:

  • 看看fabricjs
  • 只有通过阅读,我在您的代码中看到的唯一错误是 xlink 名称空间解析器。但是你甚至不需要这个属性,所以不要设置它。
  • 实际上即使出现此错误,您的第一次尝试在我的 FF 和 Android 上的 chrome 上都可以正常工作。 jsfiddle.net/1by04Lb5你用什么浏览器?
  • Chrome 测试
  • 这令人费解。我现在再次尝试了我的第一次尝试并且它有效。我很抱歉浪费你的时间。关于你提到的错误,我是直接去掉那行代码,还是去掉xlink参数?

标签: javascript canvas svg


【解决方案1】:

canvg 库可以满足您的需求。

来自介绍文字:

canvg 是一个 SVG 解析器和渲染器。它获取 SVG 文件的 URL 或 SVG 文件的文本,在 JavaScript 中对其进行解析,然后在 Canvas 元素上呈现结果。示例的渲染速度与原生 SVG 差不多。

我之前使用过它,发现它简单易用且可靠。

【讨论】:

  • 谢谢。我打算接下来去那里,但一直希望有更容易的事情。
  • 没问题。是的,更简单的东西会很好,但我不知道没有库或等效大量代码的任何方法。
  • canvg 对于简单的事情是可以的,但请记住,它需要影响 SVG 的 all CSS 是内联的,否则它将被忽略(至少在我上次这样做时)用过)
  • 有趣。我想是有道理的。在我的情况下这很好。它可能不适用于您的情况,但您始终可以将 SVG 分层放在画布上,只要您不需要在 SVG 元素的下方和上方都进行绘制。我相信你已经考虑过了。
  • 也感谢在我开始之前知道它易于使用且可靠,这很好。你知道它是否支持其他 svg 中定义的 url refs 到 defs(如线性渐变)?你知道它是否有可能在旧浏览器上工作(比如 UIwebview 中的移动 safari 吗?)
猜你喜欢
  • 2010-12-01
  • 2014-02-04
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多