43 Stimmen

Methode zur Umwandlung von HTML5 Canvas in SVG?

Ich muss eine HTML5-Leinwand zur Bearbeitung in SVG konvertieren. Wie kann ich das erreichen?

44voto

Kerry Liu Punkte 2022

Versuchen Sie canvas2svg.js . [ Demo ]

Ich habe das selbst gebraucht und habe eine Bibliothek dafür geschrieben. Zu der Zeit, die anderen Bibliotheken waren ein bisschen spärlich, oder nicht erzeugen gültige SVG.

Das Grundkonzept ist jedoch dasselbe. Sie erstellen einen 2D-Canvas-Kontext und generieren dann ein SVG-Szenengraph, wenn Sie Canvas-Zeichenbefehle aufrufen. Im Grunde können Sie dieselbe Zeichenfunktion wiederverwenden. Je nachdem, welchen Kontext Sie ihr übergeben, zeichnen Sie entweder auf eine Standard-2D-Leinwand oder erzeugen ein SVG-Dokument, das Sie serialisieren können.

Sie können ein Canvas-Element, auf das gezeichnet wurde, nicht wirklich "transformieren", da es sich nur um eine Bitmap handelt, denken Sie daran. Wenn Sie nach SVG exportieren, rufen Sie eigentlich nur dieselbe Zeichenfunktion erneut mit einem gefälschten Kontext auf.

Ein kurzes Beispiel:

//create a canvas2svg mock context
var myMockContext = new C2S(500,500); //pass in your desired SVG document width/height

var draw = function(ctx) {
    //do your normal drawing
    ctx.fillRect(0,0,200,200);
    //etc...
}

draw(myMockContext);
myMockContext.getSerializedSvg(); //returns the serialized SVG document
myMockContext.getSvg(); //inline svg

8voto

albert Punkte 8038

Canvas-svg ermöglicht das Speichern von 2d http://code.google.com/p/canvas-svg/ Sie können mit canvg das Gegenteil tun http://code.google.com/p/canvg/

2voto

Brett Zamir Punkte 13189

Siehe auch http://code.google.com/p/html5-canvas-svg/

Fabric.js wirbt damit, einen "Canvas-to-svg"-Parser zu haben, und es gibt eine Demo, die offenbar konvertiert Canvas in SVG . Während die anderen Elemente funktionieren, wenn Sie die Steuerelemente verwenden und dann "Rasterize Leinwand zu" SVG, hat es ein Problem konvertieren das Standard-Bild und nicht alle Objekte als Pfaddaten exportieren (dh, wenn Sie die svg in Stoff ohne Pfaddaten importiert, kann es nicht "vektorisieren" es ab 2020), so müssten Sie überprüfen, ob dies tatsächlich in der Lage ist, rohe Leinwände zu SVG konvertieren oder nur, wenn die Erstellung von Elementen durch den Editor.

1voto

squishy Punkte 61

Ich denke, die Leinwand muss bereits eine SVG für diese Methode zeichnen, aber ich fand es im Laufe des Versuchs, eine Download-SVG-Schaltfläche selbst zu erstellen, lief auch in diesem Stapel Overflow Frage in der gleichen Suche dachte, es kann relevant sein.

von https://bramp.github.io/js-sequence-diagrams/

etwa Zeile 200, aber wer weiß, vielleicht bearbeitet er die Seite in Zukunft

Editor ist nur ein div-Element, und für den Zweck dieses Geräusches packt er einfach das Material, aus dem das svg erzeugt wurde, in das heruntergeladene svg.

diagram_div ist die Leinwand, in der sich die eigentliche Grafik befindet.

function(ev) {
  var svg = diagram_div.find('svg')[0];
  var width = parseInt(svg.width.baseVal.value);
  var height = parseInt(svg.height.baseVal.value);
  var data = editor.getValue();
  var xml = '<?xml version="1.0" encoding="utf-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"><svg xmlns="http://www.w3.org/2000/svg" width="' + width + '" height="' + height + '" xmlns:xlink="http://www.w3.org/1999/xlink"><source><![CDATA[' + data + ']]></source>' + svg.innerHTML + '</svg>';

  var a = $(this);
  a.attr("download", "diagram.svg"); // TODO I could put title here
  a.attr("href", "data:image/svg+xml," + encodeURIComponent(xml));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X