Accéder aux données SVG via JavaScript
Je suis en train de travailler sur une application web en utilisant SVG & JS. Les choses vont bien mais je suis un peu confus par le traitement des données.
Les données pour les objets que les utilisateurs de créer dynamiquement ajoutés à la SVG de la racine. Où & comment est-ce SVG données stockées, & comment puis-je y accéder? La raison pour laquelle je veux lire, c'est que je veux convertir ce fichier SVG données en HTML5 canvas (à l'aide de Google canvg) et enfin le transformer en une image au format png à être stockées dans notre db pour référence.
Tous conseils seront très appréciés.
source d'informationauteur Zain
Vous devez vous connecter pour publier un commentaire.
Lorsqu'un navigateur web charge un fichier SVG, (à peu près) analyse le flux d'octets et crée un DOM structure dans la mémoire pour le fichier SVG. C'est cette représentation en mémoire qui est modifiée lorsque le script crée dynamiquement et ajoute de nouveaux éléments dans le document.
Vous pouvez voir un exemple très simple de ce sujet ici:
http://phrogz.net/svg/svg_in_xhtml5.xhtml
Le fichier SVG charges avec un cercle à l'arrière-plan pour le visage, puis JavaScript crée dynamiquement les yeux et le nez et ajoute que les enfants de l'élément SVG.
Il y a trois façons je sais que vous pouvez accéder à ces informations et en faire une toile:
Vous pouvez parcourir le DOM des éléments de vous-même, et la question de toile contexte commandes de dessin:
Voir le SVG DOM de référence pour plus d'informations sur les propriétés et les méthodes disponibles pour vous, ou simplement utiliser le DOM Core 2 méthodes de récupérer les propriétés. Pour plus de simplicité, vous pouvez utiliser celui-ci.
Par exemple, vous pouvez accéder à la (non-SMIL animation)
cx
du cercle à l'aide de la SVG DOM viavar cx = kid.cx.baseVal.value;
ou vous pouvez simplement fairevar cx = kid.getAttribute('cx');
.Cela va être simple où SVG et Canvas ont les mêmes commandes (par exemple,
rect
ouline
), un peu de travail où ils ne correspondent pas exactement (par exemplecircle
contrearcTo
polyline
comme une série delineTo
commandes), et beaucoup de travail pour lepath
élément et son de nombreuses commandes de dessin.Par cette réponse et ce documentutilisez le
XMLSerializer
interface pour obtenir les SVG en arrière comme le balisage, l'utiliser directement comme source d'unimg
puisdrawImage
que sur la toile. À l'aide de mon exemple ci-dessus:Si vous avez SVG en XHTML (comme dans mon exemple), la sérialisation de ne pas capturer les styles définis en dehors de la SVG bloc (comme dans mon exemple) et donc ils ne seront pas appliquées à l'image.
Noter que par cette question/réponse (mine de), vous devez définir la
onload
attribut avant vous définissez lasrc
pour les données de l'URL si vous voulez IE9 compatibilité.Malheureusement, en raison de ce qui peut ou peut ne pas être un bugle dessin d'un data-url de l'image d'une toile causes à l'origine-propre pavillon à être mis à
false
ce qui signifie que vous ne serez pas en mesure d'appelertoDataURL()
sur la toile et d'obtenir votre PNG dos. Alors...Je suppose que pour des besoins spécifiques du Client-modifié le format SVG->Toile->format PNG-sur-server, vous devez utiliser la première étape ci-dessus pour sérialiser l'
svg_xml
et de passer ensuite que raw source de canvg.Sinon, vous pourriez envisager de la sérialisation de l'SVG ci-dessus et de soumettre directement à votre serveur et de faire côté serveur SVG-à-conversion PNG.
Le webkit bug mentionné dans @Phrogz réponse semble avoir été corrigé dans les versions plus récentes, donc j'ai trouvé une solution qui ne nécessite pas un manuel d'analyser est
qui nécessite
https://code.google.com/p/svgfix/ et https://code.google.com/p/canvg/ et utilise d3.js pour obtenir le svg source, ce qui devrait être faisable sans d3.js ainsi (mais cela prend en charge l'ajout de métadonnées requises qui peut causer des problèmes lorsque manquant).