Zugriff auf die SVG-Daten per JavaScript
Arbeite ich an einer web-Anwendung mit SVG & JS. Die Dinge laufen gut, aber ich bin ein bisschen verwirrt durch den Umgang mit den Daten.
Die Daten für die Objekte, die die Nutzer erstellen, die dynamisch an die SVG-Wurzel. Wo & wie wird diese SVG-Daten gespeichert werden, & wie kann ich darauf zugreifen? Der Grund, warum ich es Lesen wollen ist, dass ich konvertieren wollen diese SVG-Daten in HTML5-canvas (mit Google canvg) und biegt schließlich in ein png-Bild gespeichert werden, in unseren db-Referenz.
Jede Beratung wäre sehr geschätzt werden.
InformationsquelleAutor Zain | 2011-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ein web-browser lädt eine SVG-Datei es (grob) analysiert den Datenstrom und erstellt ein DOM-Struktur im Speicher der SVG-Datei. Es ist dieses in-memory-Repräsentation, die geändert wird, wenn das Skript erstellt dynamisch und fügt neue Elemente in das Dokument.
Können Sie sehen, ein sehr einfaches Beispiel dieses hier:
http://phrogz.net/svg/svg_in_xhtml5.xhtml
Die SVG-Datei wird geladen und mit einem Kreis im hintergrund für das Gesicht, und dann JavaScript dynamisch erstellt die Augen und die Nase und fügt diese als Kinder des SVG-element.
Gibt es drei Möglichkeiten, die ich kenne, dass Sie auf diese Informationen zugreifen kann und ihn in eine Leinwand:
Können Sie zu Fuß den DOM von Elementen selbst, und Problem canvas-Kontext zeichnen-Befehle:
Sehen die SVG-DOM-Referenz für weitere Informationen über die Eigenschaften und Methoden zur Verfügung, oder benutzen Sie einfach das DOM 2 Core Methoden zum abrufen von Eigenschaften. Für Einfachheit, möchten Sie vielleicht die Verwendung der letzteren.
Zum Beispiel, können Sie entweder den aktuellen (nicht-SMIL animiert)
cx
der Kreis, der das SVG-DOM übervar cx = kid.cx.baseVal.value;
oder Sie können einfach tunvar cx = kid.getAttribute('cx');
.Dies ist einfach, wo die SVG-und Canvas-ähnliche Befehle (z.B.
rect
oderline
), ein wenig zu arbeiten, wo Sie nicht exakt übereinstimmen (z.B.circle
versusarcTo
,polyline
als eine Reihe vonlineTo
Befehle), und eine Menge Arbeit für diepath
element und seine viele Zeichenbefehle.Pro diese Antwort und dieses Papier, verwenden Sie die
XMLSerializer
- Schnittstelle verwenden, um die SVG zurück als markup verwenden, die direkt als Quelle einesimg
, und danndrawImage
dass auf die Leinwand. Mit meinem obigen Beispiel:Wenn Sie SVG in XHTML (wie in meinem Beispiel), die Serialisierung nicht zu erfassen Stile definiert, die außerhalb des SVG-block (wie in meinem Beispiel), und so werden Sie nicht angewendet werden in der Bild.
Beachten Sie, dass pro diese Frage/Antwort (von mir), müssen Sie die
onload
Attribut vor legen Sie diesrc
um die Daten-URL, wenn Sie möchten, IE9 Kompatibilität.Leider, wegen dem, was sein kann oder nicht ein bug, Zeichnung, eine Daten-url-Bild auf eine Leinwand, bewirkt, dass die origin-clean flag gesetzt werden, um
false
, was bedeutet, dass Sie nicht in der Lage zu nennentoDataURL()
auf der Leinwand und Holen Sie sich Ihre PNG-zurück. So...Ich nehme an, für Ihre spezifischen Bedürfnisse Client-modifizierte SVG->Canvas->PNG-on-server Sie müssen den ersten Schritt vor dem serialisieren die
svg_xml
- und dann passieren, dass der raw-Quelle zu canvg.Alternativ könnten Sie die Serialisierung der SVG-pro der über-und Abgabe, die direkt auf dem server und tut serverseitige SVG-to-PNG-Konvertierung.
herrliche Antwort!! Kann Sie auch darauf hinweisen, warum so etwas wie var svg = document.getElementById('svg') wird nicht funktionieren......
Das wird nur arbeiten, finden Sie, vorausgesetzt, Sie haben
<svg id="svg">
auf Ihrer Seite. Sie könnengetElementsByTagName('svg')[0]
wenn Sie keine ID haben, oder einfach (auf modernen Browsern)var svg = document.querySelector('svg')
.InformationsquelleAutor Phrogz
Den webkit-bug erwähnt in @Phrogz Antwort zu haben scheint, wurde behoben in neueren Versionen, so dass ich eine Lösung gefunden, die nicht erfordern eine manuelle Parsen ist
erfordert
https://code.google.com/p/svgfix/ und https://code.google.com/p/canvg/ und Verwendungen, von d3.js erhalten Sie die svg-Quelle, das sollte machbar sein, ohne d3.js (aber dies kümmert sich um das hinzufügen von erforderlichen Metadaten, die zu Problemen führen kann, wenn nicht vorhanden).
InformationsquelleAutor Nicolas78