实际上,可以将一个 SVG 的 drawImage() 绘制到 Canvas 中(ArtemGr 的代码对我来说在 FF 和 Chrome 中工作)。
但是在 Chrome 中,您会遇到 Origin Policy 错误(在https://bugs.webkit.org/show_bug.cgi?id=17352中报告了一个错误)。
我尝试将canvg与动力学一起使用,但我发现了2个问题:
- 启用 Kinetic 的监听时非常慢;
- 如果您需要缩放图像,它的渲染质量很差;
我发现的一个解决方案是使用 fabricjs 的 SVG 渲染,这被证明是非常优越的。代码如下所示:
var fabricSvg;
// uses the fabric SVG engine
fabric.loadSVGFromUrl(svgSource, function(objects, opts) {
if (objects.length > 1)
fabricSvg = new fabric.PathGroup(objects, opts);
else
fabricSvg = objects;
fabricSvg.originX = 'left';
fabricSvg.originY = 'top';
var drawSvg = new Kinetic.Shape({
x: 10, y: 10,
drawFunc: function(canvas) {
// use fabric SVG engine with Kinetic canvas context
fabricSvg.render(canvas.getContext());
}
});
layer.add(drawSvg);
});
这样我们就可以使用 Kinetic 动画引擎,它比 Fabric 的性能更好,以及 Fabric 的 SVG 渲染模块。