Надеюсь, это поможет, но у этого метода есть 2 ограничения:
Требуется пространство имен xmlns="http://www.w3.org/2000/svg"
или изображение не загружается
Стили должны быть внутри svg
или не должны применяться
document.querySelector('button').onclick = function () {
var data = document.querySelector('div#svg').innerHTML;
var img = new Image();
img.src = 'data:image/svg+xml;base64,' + btoa(data);
img.onload = function() {
document.querySelector('canvas#copy')
.getContext('2d')
.drawImage(img, 0, 0);
}
}
div, body, svg {
margin: 0;
display: inline-block;
}
<div id="svg">
<svg width="150" height="150" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke-width="2.2" transform="translate(75,75)">
<circle r="10" stroke="hsl(10,75%,75%)"/>
<circle r="15" stroke="hsl(10,75%,75%)"/>
<circle r="20" stroke="hsl(40,75%,75%)"/>
<circle r="25" stroke="hsl(70,75%,75%)"/>
<circle r="30" stroke="hsl(100,75%,75%)"/>
<circle r="35" stroke="hsl(130,75%,75%)"/>
<circle r="40" stroke="hsl(160,75%,75%)"/>
<circle r="45" stroke="hsl(190,75%,75%)"/>
</g>
</svg>
</div>
<div>
<button>>></button>
</div>
<canvas width="150" height="150" id="copy"></canvas>
PS: Извините за мой английский