Modifier le fichier SVG – Exemples C#
Aspose.SVG pour .NET vous permet de modifier des fichiers SVG et d’apporter des modifications à leur contenu. Le modèle objet de document (DOM) de l’API est entièrement compatible avec les spécifications SVG officielles et signifie un contrôle total sur les nœuds SVG et leurs champs d’édition. Vous pouvez modifier le document en ajoutant de nouveaux nœuds, en supprimant ou en modifiant le contenu des nœuds existants.
Dans cet article, nous montrons comment modifier SVG à l’aide de la bibliothèque Aspose.SVG for .NET et examinons des exemples C# détaillés sur la façon d’ajouter des éléments à un document SVG et de les modifier.
Ajouter des éléments à un document SVG
Aspose.SVG pour l’API .NET vous permet d’ajouter divers éléments à un document. Tout d’abord, vous créeriez un nouvel élément ou nœud ; Ensuite, vous pouvez ajouter l’élément au document.
Vous pouvez utiliser la méthode CreateElementNS(
namespaceURI, qualifiedName
) de la classe SVGDocument pour créer une instance de la classe Element – l’élément requis du fichier qualifié donné. nom et URI de l’espace de noms. LenamespaceURI
définit la référence à la spécification W3C SVG. LequalifiedName
doit contenir le nom de balise de chaîne de l’élément. N’oubliez pas que vous devez utiliser le casting du type (conversion explicite) pour obtenir l’élément correspondant.Pour ajouter un élément au document SVG, l’API fournit la méthode InsertBefore(
node, child
) de la classe Node, qui insère lenode
avant le nœud enfant existant ou à la fin de la liste des enfants si lechild
est nul.
La propriété
RootElement de la classe
SVGDocument pointe vers l’élément racine <svg>
du document. L’extrait de code suivant illustre comment créer et ajouter l’élément <g>
comme premier enfant dans le document SVG.
1 var svgElement = document.RootElement;
2 var gElement = (SVGGElement)document.CreateElementNS("http://www.w3.org/2000/svg", "g");
3 svgElement.InsertBefore(gElement, svgElement.FirstChild);
Nous pouvons spécifier les attributs des éléments et leurs valeurs en utilisant
SetAttribute(name, value
),
GetAttribute(name
),
HasAttribute(name
),
RemoveAttribute(name
) méthodes de la classe
Element. Par exemple, si vous créez un groupe d’éléments graphiques et que vous les placez dans l’élément <g>
, vous pouvez définir des paramètres communs :
1 gElement.SetAttribute("fill", "#8A8D8F");
2 gElement.SetAttribute("stroke", "magenta");
3 gElement.SetAttribute("stroke-width", "4");
Comment ajouter des formes de base à un document SVG
Les formes SVG de base peuvent être créées à l’aide de la méthode
CreateElementNS(namespaceURI, qualifiedName
). Le qualifiedName
doit contenir le nom de la balise de chaîne de l’élément graphique SVG.
De cette façon, vous pouvez créer des cercles SVG (classe SVGCircleElement, qualifiedName = “circle”), des ellipses (classe SVGEllipseElement, qualifiedName = “ellipse”), des rectangles (classe SVGRectElement, qualifiedName = “rect”), des lignes (classe SVGLineElement, qualifiedName = " line"), les polylignes (classe SVGPolylineElement, qualifierName = “polyline”), les polygones (classe SVGPolygonElement, qualifierName = “polygon”) et les courbes de Bézier (classe SVGPathElement, qualifierName = “path”).
Cercle SVG
Chaque élément graphique possède ses propres attributs spécifiques (propriétés), grâce auxquels vous pouvez contrôler ses paramètres et caractéristiques.
Cx, Cy, R
sont des propriétés de cercle de type
SVGAnimatedLength, dont les données statiques peuvent être définies ou lues via la construction : element.X.BaseVal.Value
.
L’extrait de code suivant montre comment créer un cercle SVG et l’ajouter dans l’élément <svg>
du fichier SVG existant :
1using Aspose.Svg;
2using System.IO;
3using Aspose.Svg.Dom;
4using Aspose.Svg.Paths;
5...
6
7 // Set SVG Namespace Url
8 string SvgNamespace = "http://www.w3.org/2000/svg";
9
10 string documentPath = Path.Combine(DataDir, "basic-shapes.svg");
11
12 using (var document = new SVGDocument(documentPath))
13 {
14 // Get root <svg> element of the document
15 var svgElement = document.RootElement;
16
17 // Create a <circle> element and set attributes values
18 var circleElement = (SVGCircleElement)document.CreateElementNS(SvgNamespace, "circle");
19 circleElement.Cx.BaseVal.Value = 100F;
20 circleElement.Cy.BaseVal.Value = 100F;
21 circleElement.R.BaseVal.Value = 50F;
22 circleElement.SetAttribute("fill", "Salmon");
23
24 // Add the <circle> element as the first child to <svg> element
25 svgElement.InsertBefore(circleElement, svgElement.FirstChild);
26
27 // Work with the document here...
28 // Add a polyline and change stroke attributes for all circle and ellipse elements (see later)
29 }
30 // Save the document
31 document.Save(Path.Combine(OutputDir, "basic-shapes_out.svg"));
L’ellipse (Cx, Cy, Rx, Ry
), le rectangle (X, Y, Width, Height, Rx, Ry
) et la ligne (X1, Y1, X2, Y2
) ont leurs propres attributs qui peut être réglé de la même manière.
Polyligne SVG
Les
SVGPolygonElement et
SVGPolylineElement ont la propriété Points
du type
SVGPointList, qui donne accès au contenu de base de l’attribut points
, qui correspond de manière unique à la syntaxe SVG.
Un exemple simple de création de polyligne SVG est illustré dans l’extrait de code suivant :
1 // Set SVG Namespace Url
2 string SvgNamespace = "http://www.w3.org/2000/svg";
3
4 // Create a <polyline> element and set attributes values:
5 var polylineElement = (SVGPolylineElement)document.CreateElementNS(SvgNamespace, "polyline");
6 SVGPoint point1 = svgElement.CreateSVGPoint();
7 point1.X = 270;
8 point1.Y = 240;
9 SVGPoint point2 = svgElement.CreateSVGPoint();
10 point2.X = 290;
11 point2.Y = 220;
12 SVGPoint point3 = svgElement.CreateSVGPoint();
13 point3.X = 310;
14 point3.Y = 240;
15 polylineElement.Points.AppendItem(point1);
16 polylineElement.Points.AppendItem(point2);
17 polylineElement.Points.AppendItem(point3);
18 polylineElement.SetAttribute("stroke", "grey");
19 polylineElement.SetAttribute("stroke-width", "5");
20 polylineElement.SetAttribute("fill", "none");
21
22 // Add the SVG polyline to children of the <svg> element
23 svgElement.AppendChild(polylineElement);
La méthode
CreateSVGPoint() produit une instance de la classe
SVGPoint, dans laquelle vous pouvez définir les valeurs X
et Y
via les mêmes propriétés de nom. L’objet par défaut est initialisé au point (0,0) dans le système de coordonnées personnalisé.
La méthode
AppendItem(T newItem
)insère un nouveau point à la fin de la liste. Des lignes droites relient ces points dans la liste et forment une polyligne ou un polygone – une forme géométrique plane formée par une polyligne fermée.
La méthode
AppendChild(node
) ajoute le nouvel enfant à la fin de la liste des enfants de ce nœud. L’extrait de code montre que les attributs stroke
, stroke-width
et fill
sont spécifiés et que polylineElement
est inséré dans l’élément <svg>
en tant que dernier enfant.
Prenons un exemple de modification d’un fichier SVG existant basic-shapes.svg : nous ajouterons le cercle et la polyligne décrits ci-dessus et modifierons les propriétés de trait pour tous les cercles et ellipses. L’extrait de code suivant montre comment rechercher tous les cercles et ellipses dans un élément <svg>
et remplacer leurs propriétés de trait :
1 // Set stroke attributes for all <circle> and <ellipse> elements
2 foreach (Element element in svgElement.Children)
3 {
4 if (element is SVGCircleElement || element is SVGEllipseElement)
5 {
6 element.SetAttribute("stroke-width", "6");
7 element.SetAttribute("stroke", "#C8102E");
8 }
9 }
La figure montre la visualisation du fichier SVG original basic-shapes.svg et du fichier qui a été édité (modifié).
Modifier le chemin SVG
Pour créer un chemin SVG à l’aide de l’API Aspose.SVG, vous devez créer une instance de la classe
SVGPathElement à l’aide de la méthode CreateElementNS(namespaceURI,qualifiedName
).
Les méthodes
CreateSVGPathSegMovetoAbs(x, y
),
CreateSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1
) et
CreateSVGPathSegCurvetoQuadraticSmoothAbs(x, y
) prennent des paramètres de les commandes de données de chemin M, C
et T
comme leurs propres paramètres. La propriété
PathSegList
de type SVGPathSegList permet d’accéder au contenu de l’attribut d
, sous forme de liste de segments de chemin, qui correspond à la syntaxe SVG (les détails sont dans l’article
SVG Path Data).
L’extrait de code suivant montre comment créer le chemin SVG et l’ajouter à l’élément <svg>
:
1 // Create a <path> element
2 var pathElement = (SVGPathElement)document.CreateElementNS(SvgNamespace, "path");
3
4 // Set d attribute parameters – SVG path data
5 SVGPathSeg pathSeg1 = pathElement.CreateSVGPathSegMovetoAbs(10, 200);
6 SVGPathSeg pathSeg2 = pathElement.CreateSVGPathSegCurvetoQuadraticAbs(180, 200, 25, 210);
7 SVGPathSeg pathSeg3 = pathElement.CreateSVGPathSegCurvetoQuadraticSmoothAbs(300, 250);
8 SVGPathSeg pathSeg4 = pathElement.CreateSVGPathSegCurvetoQuadraticSmoothAbs(420, 250);
9 SVGPathSeg pathSeg5 = pathElement.CreateSVGPathSegCurvetoQuadraticSmoothAbs(490, 150);
10 pathElement.PathSegList.AppendItem(pathSeg1);
11 pathElement.PathSegList.AppendItem(pathSeg2);
12 pathElement.PathSegList.AppendItem(pathSeg3);
13 pathElement.PathSegList.AppendItem(pathSeg4);
14 pathElement.PathSegList.AppendItem(pathSeg5);
15
16 // Set fill and stroke attributes
17 pathElement.SetAttribute("stroke", "magenta");
18 pathElement.SetAttribute("fill", "none");
19 pathElement.SetAttribute("stroke-width", "4");
20
21 // Add the path as the first child in the <svg> element
22 svgElement.InsertBefore(pathElement, svgElement.FirstChild);
Vous pouvez utiliser un code aussi détaillé et complet en termes de DOM, de programmation, d’utilisation du document et de navigation dans le fichier. En utilisant la méthode
SetAttribute(), vous pouvez écrire le code sur une seule ligne pour le paramètre d
des données de chemin SVG.
Dans l’exemple suivant, nous utilisons le code sur une ligne pour créer le même chemin (chemin SVG d’origine). De plus, nous modifierons les paramètres des commandes moveto(x,y) M
et T
(x,y) dans le chemin d’origine pour en recevoir une nouvelle.
1using Aspose.Svg;
2using System.IO;
3using Aspose.Svg.Paths;
4...
5
6 // Set SVG Namespace Url
7 string SvgNamespace = "http://www.w3.org/2000/svg";
8
9 using (var document = new SVGDocument())
10 {
11 var svgElement = document.RootElement;
12
13 // Create a <path> element and set SVG path data
14 var pathElement = (SVGPathElement)document.CreateElementNS(SvgNamespace, "path");
15 pathElement.SetAttribute("d", "M 10 200 Q 25 110 180 200 T 300 250 T 420 250 T 490 150");
16
17 // Edit SVG path
18 foreach (SVGPathSeg pathSeg in pathElement.PathSegList)
19 {
20 // Editing T commands parameters
21 if (pathSeg is SVGPathSegCurvetoQuadraticSmoothAbs)
22 {
23 SVGPathSegCurvetoQuadraticSmoothAbs pathSegCurvetoQuadraticSmoothAbs = pathSeg as SVGPathSegCurvetoQuadraticSmoothAbs;
24 pathSegCurvetoQuadraticSmoothAbs.X -= 60;
25 pathSegCurvetoQuadraticSmoothAbs.Y -= 65;
26 }
27 // Editing M command parameters
28 if (pathSeg is SVGPathSegMovetoAbs)
29 {
30 SVGPathSegMovetoAbs pathSegMovetoAbs = pathSeg as SVGPathSegMovetoAbs;
31 pathSegMovetoAbs.X = 200;
32 pathSegMovetoAbs.Y = 100;
33 }
34 }
35 // Set fill and stroke attributes
36 pathElement.SetAttribute("stroke", "red");
37 pathElement.SetAttribute("fill", "none");
38 pathElement.SetAttribute("stroke-width", "4");
39
40 // Add the <path> element as the first child to the <svg> element
41 svgElement.InsertBefore(pathElement, svgElement.FirstChild);
42
43 // Save the document
44 document.Save(Path.Combine(OutputDir, "edit-svg-path-data.svg"));
45 }
La figure illustre les chemins originaux (noirs) et modifiés (rouges). Vous pouvez afficher et enregistrer le fichier SVG modifié en suivant le lien – edit-svg-path-data.svg.
Pour éditer un fichier SVG, vous devez d’abord rechercher les éléments à éditer dans le document. Il existe plusieurs façons de procéder, telles que les sélecteurs CSS ou les requêtes XPath. Des informations détaillées sur la façon de modifier le fichier SVG en naviguant dans le document peuvent être trouvées dans l’article Navigation & Inspection SVG.
Si vous souhaitez modifier les couleurs SVG des éléments, veuillez consulter les détails dans l’article Comment changer la couleur SVG. Ici, vous apprenez comment travailler avec la couleur SVG à l’aide de la bibliothèque Aspose.SVG pour .NET et réfléchissez à la façon de changer la couleur SVG des éléments ou de changer la couleur d’arrière-plan dans les fichiers SVG.
Dessin SVG sur un bitmap existant
Le bitmap peut être utilisé comme arrière-plan pour le dessin. Vous pouvez ajouter les formes, les chemins ou le texte SVG. Par exemple, la figure ci-dessous est réalisée en ajoutant un cercle et du texte au bitmap servant d’arrière-plan:
1<svg xmlns="http://www.w3.org/2000/svg">
2 <image href="http://docs.aspose.com/svg/images/api/seaside.jpg" height="480" width="640" x="20" y="20"/>
3 <text style="font-size: 1.4em;" x="420px" fill="gold" y="280px">The beach is beautiful...</text>
4 <circle cx="520" cy="120" r="60" stroke="gold" stroke-width="70" fill="none" stroke-dasharray="2,14"/>
5</svg>
Le code C# suivant crée le document SVG ci-dessus à partir de zéro. Nous ajoutons au document certains éléments SVG tels qu’une image, un texte et un élément cercle, puis enregistrons le document SVG dans un fichier :
- Créez un document SVG à l’aide de la classe SVGDocument et accédez à l’élément SVG racine à l’aide de la propriété RootElement.
- Créez un élément
<image>
, définissez les attributs requis et ajoutez-le à l’élément<svg>
.- Utilisez la méthode
CreateElementNS(
namespaceURI, qualifiedName
) de la classe SVGDocument pour créer une instance de la classe SVGImageElement. - Utiliser des propriétés de type
SVGAnimatedLength, dont les données statiques peuvent être définies ou lues via la construction:
element.X.BaseVal.Value
: définit leshref, height, width, x,
et Attributsy
.
- Utilisez la méthode
CreateElementNS(
- De la même manière, créez un élément
<text>
à l’aide de la classe SVGTextElement et définissez les attributs requis. Utilisez la propriété Style pour définir la taille de la police et la méthode SetAttribute(name, value
) pour spécifier des attributs tels quex, y
etfill
. - Créez un élément
<circle>
à l’aide de la classe SVGCircleElement. Les attributscx, cy
etr
définissent les coordonnées centrales et le rayon du cercle. D’autres attributs tels questroke, stroke-width, fill
etstroke-dasharray
sont utilisés pour styliser le cercle. - Utilisez la méthode AppendChild() pour ajouter les éléments SVG créés (imageElement, textElement et circleElement) à la fin de la liste des enfants de l’élément racine SVG (svgElement).
- Appelez la méthode Save() pour enregistrer le document SVG dans un fichier nommé dans le répertoire de sortie spécifié.
1using Aspose.Svg;
2using System.IO;
3...
4 // Set SVG Namespace Url
5 string SvgNamespace = "http://www.w3.org/2000/svg";
6
7 using (var document = new SVGDocument())
8 {
9 var svgElement = document.RootElement;
10
11 // Create an <image> element and add it into svgElement
12 var imageElement = (SVGImageElement)document.CreateElementNS(SvgNamespace, "image");
13 imageElement.Href.BaseVal = "http://docs.aspose.com/svg/images/api/seaside.jpg";
14 imageElement.Height.BaseVal.Value = 480;
15 imageElement.Width.BaseVal.Value = 640;
16 imageElement.X.BaseVal.Value = 20;
17 imageElement.Y.BaseVal.Value = 20;
18 svgElement.AppendChild(imageElement);
19
20 // Create a <text> element, set its attributes, and it into svgElement
21 var textElement = (SVGTextElement)document.CreateElementNS(SvgNamespace, "text");
22 textElement.Style.FontSize = "1.4em";
23 textElement.SetAttribute("x", "420px");
24 textElement.SetAttribute("fill", "gold");
25 textElement.SetAttribute("y", "280px");
26 textElement.TextContent = "The beach is beautiful...";
27 svgElement.AppendChild(textElement);
28
29 // Create a <circle> element, set its attributes, and add it into svgElement
30 var circleElement = (SVGCircleElement)document.CreateElementNS(SvgNamespace, "circle");
31 circleElement.Cx.BaseVal.Value = 520;
32 circleElement.Cy.BaseVal.Value = 120;
33 circleElement.R.BaseVal.Value = 60;
34 circleElement.SetAttribute("stroke", "gold");
35 circleElement.SetAttribute("stroke-width", "70");
36 circleElement.SetAttribute("fill", "none");
37 circleElement.SetAttribute("stroke-dasharray", "2,14");
38 svgElement.AppendChild(circleElement);
39
40 // Save the document
41 document.Save(Path.Combine(OutputDir, "svg-drawing-on-bitmap.svg"));
42 }
Nous avons peint le cercle SVG avec une grande valeur de stroke-width
. L’application de l’attribut stroke-dasharray
convertit le trait du cercle en ligne pointillée. En sélectionnant les valeurs des zones remplies et non remplies, vous pouvez obtenir l’effet visuel souhaité. Pour plus d’informations sur les propriétés des attributs de style, veuillez consulter l’article
Remplissages et contours en SVG.
Vous pouvez télécharger les exemples complets et les fichiers de données depuis GitHub. À propos du téléchargement depuis GitHub et de l’exécution d’exemples, vous le découvrirez dans la section Comment exécuter les exemples.