Elementos SVG en canvas

facebook-svg gplus-svg twitter-svg

La interfaz XMLSerializer utiliza el método serializeToString() para construir una cadena de texto de una estructura (árbol) DOM.

El método encodeURIComponent() codifica un componente URI ( Uniform Resource Identifier ) reemplazando algunos caracteres con sus equivalentes UTF-8. Por ejemplo reemplaza < con %3C, > con %3E, # con %23 etc. . .

Suponiendo que hay un elemento SVG en el documento que queremos dibujar en el canvas, tenemos que:

- Transformar la estructura DOM del elemento SVG en una cadena de texto:

var svgURL = new XMLSerializer().serializeToString(svgElement); 

- Codificar esta cadena de texto utilizando encodeURIComponent()

- Agregar 'data:image/svg+xml; charset=utf8, ' delante de la cadena de texto codificada. Esto crea un código data URI que podemos utilizar como valor del atributo src de una imagen.

- Cuando la imagen esté cargada la podemos dibujar en el canvas  utilizando el método drawImage  del contexto del canvas





let ctx = canvas.getContext("2d")

function svg_en_canvas(svgElement, ctx, callback){
  var svgURL = new XMLSerializer().serializeToString(svgElement);
  //pinta la imágen en el canvas
  var img  = new Image();
  img.onload = function(){
    ctx.drawImage(this, 0,0);
    callback();
    }
  img.src = "data:image/svg+xml; charset=utf8, "+encodeURIComponent(svgURL);
  }

//llama la función svg_en_canvas
svg_en_canvas(document.querySelector("svg"), ctx, ()=>{console.log(canvas.toDataURL() )})

Vea este ejemplo en Codepen:

See the Pen Copy SVG element to canvas by Gabi (@enxaneta) on CodePen.