Editar archivo SVG – Ejemplos de C#

Aspose.SVG for .NET le permite editar archivos SVG y realizar cambios en su contenido. El modelo de objetos de documento (DOM) de la API es totalmente compatible con las especificaciones SVG oficiales y significa control total sobre los nodos SVG y sus campos para editar. Puede modificar el documento agregando nuevos nodos, eliminando o editando el contenido de los nodos existentes.

En este artículo, mostramos cómo editar SVG usando la biblioteca Aspose.SVG for .NET y consideramos ejemplos detallados de C# sobre cómo agregar elementos a un documento SVG y editarlos.

Agregar elementos a un documento SVG

Aspose.SVG for .NET API le permite agregar varios elementos a un documento. Primero, crearías un nuevo elemento o nodo; luego, puede agregar el elemento al documento.

  1. Puede utilizar el método CreateElementNS(namespaceURI, qualifiedName) de la clase SVGDocument para crear una instancia de la clase Element: el elemento requerido del elemento calificado dado. nombre y URI del espacio de nombres. El namespaceURI establece la referencia a la especificación W3C SVG. El qualifiedName debe contener el nombre de la etiqueta de cadena del elemento. Recuerde, debe utilizar la conversión de tipo (conversión explícita) para obtener el elemento correspondiente.

  2. Para agregar un elemento al documento SVG, la API proporciona el método InsertBefore(node, child) de la clase Node, que inserta el node antes del nodo secundario existente o al final de la lista de hijos si el child es nulo.

La propiedad RootElement de la clase SVGDocument apunta al elemento raíz <svg> del documento. El siguiente fragmento de código ilustra cómo crear y agregar el elemento <g> como el primer elemento secundario en el documento 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);

Podemos especificar los atributos de los elementos y sus valores usando SetAttribute(name, value), GetAttribute(name), HasAttribute(name), RemoveAttribute(name) métodos de la clase Element. Por ejemplo, si crea un grupo de elementos gráficos y los coloca en el elemento <g>, puede establecer parámetros comunes:

1    gElement.SetAttribute("fill", "#8A8D8F");
2    gElement.SetAttribute("stroke", "magenta");
3    gElement.SetAttribute("stroke-width", "4");

Cómo agregar formas básicas a un documento SVG

Las formas SVG básicas se pueden crear usando el método CreateElementNS(namespaceURI, qualifiedName). El qualifiedName debe contener el nombre de la etiqueta de cadena del elemento gráfico SVG.

De esta manera puede crear círculos SVG (clase SVGCircleElement, QualifiedName = “circle”), elipses (clase SVGEllipseElement, QualifiedName = “ellipse”), rectángulos (clase SVGRectElement, QualifiedName = “rect”), líneas (clase SVGLineElement, QualifiedName = " line"), polilíneas (clase SVGPolylineElement, QualifiedName = “polyline”), polígonos (clase SVGPolygonElement, QualifiedName = “polygon”) y curvas de Bézier (clase SVGPathElement, QualifiedName = “path”).

Círculo SVG – SVG Circle

Cada elemento gráfico tiene sus propios atributos (propiedades) específicos, a través de los cuales se pueden controlar sus parámetros y características. Cx, Cy, R son propiedades circulares del tipo SVGAnimatedLength, cuyos datos estáticos se pueden configurar o leer a través de la construcción: element.X.BaseVal.Value.

El siguiente fragmento de código muestra cómo crear un círculo SVG y agregarlo al elemento <svg> del archivo SVG existente:

 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"));

La elipse (Cx, Cy, Rx, Ry), el rectángulo (X, Y, Width, Height, Rx, Ry) y la línea (X1, Y1, X2, Y2) tienen sus propios atributos que se puede configurar de manera similar.

Polilínea SVG – SVG Polyline

SVGPolygonElement y SVGPolylineElement tienen la propiedad Points del tipo SVGPointList, que proporciona acceso al contenido básico del atributo points, que coincide de forma única con la sintaxis SVG.

En el siguiente fragmento de código se ilustra un ejemplo sencillo de creación de polilíneas SVG:

 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);

El método CreateSVGPoint() produce una instancia de la clase SVGPoint, en la que puede establecer los valores X e Y a través de las propiedades del mismo nombre. El objeto predeterminado se inicializa en el punto (0,0) en el sistema de coordenadas personalizado.

El método AppendItem(T newItem)inserta un nuevo punto al final de la lista. Las líneas rectas conectan estos puntos en la lista y forman una polilínea o polígono, una forma geométrica plana formada por una polilínea cerrada.

El método AppendChild(node) agrega el nuevo hijo al final de la lista de hijos de este nodo. El fragmento de código muestra que se especifican los atributos stroke, stroke-width y fill, y que polylineElement se inserta en el elemento <svg> como último elemento secundario.

Considere un ejemplo de edición de un archivo SVG existente basic-shapes.svg: agregaremos el círculo y la polilínea descritos anteriormente y cambiaremos las propiedades del trazo para todos los círculos y elipses. El siguiente fragmento de código muestra cómo encontrar todos los círculos y elipses en un elemento <svg> y reemplazar sus propiedades de trazo:

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 figura muestra la visualización del archivo SVG original basic-shapes.svg y el archivo que fue editado (modificado).

Texto “Imagen svg original e imagen svg editada”

Editar Path SVG – Edit SVG Path

Para crear una ruta SVG usando la API Aspose.SVG, necesita crear una instancia de la clase SVGPathElement usando el método CreateElementNS(namespaceURI, qualifiedName).

Los métodos CreateSVGPathSegMovetoAbs(x, y), CreateSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1) y CreateSVGPathSegCurvetoQuadraticSmoothAbs(x, y) toman parámetros de comandos de datos de ruta M, C y T como sus propios parámetros. La propiedad PathSegList del tipo SVGPathSegList proporciona acceso al contenido del atributo d, en forma de lista de segmentos de ruta, que coincide con la sintaxis SVG (los detalles se encuentran en el artículo Datos de path SVG).

El siguiente fragmento de código muestra cómo crear la ruta SVG y agregarla al elemento <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);

Puede utilizar dicho código detallado y completo en términos de DOM, programación, trabajo con el documento y navegación por el archivo. Usando el método SetAttribute(), puede escribir el código en una sola línea para la configuración d de los datos de ruta SVG.

En el siguiente ejemplo, utilizamos el código de una línea para crear la misma ruta (ruta SVG original). Además, editaremos los parámetros de los comandos moveto(x,y) M y T(x,y) en la ruta original para recibir uno nuevo.

 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 figura ilustra las rutas originales (negras) y modificadas (rojas). Puede ver y guardar el archivo SVG editado siguiendo el enlace: edit-svg-path-data.svg.

Texto “Rutas originales y editadas”

Para editar un archivo SVG, primero debe encontrar los elementos a editar en el documento. Hay varias formas de hacer esto, como selectores CSS o consultas XPath. Puede encontrar información detallada sobre cómo editar un archivo SVG navegando por el documento en el artículo Navegación e inspección SVG.

Si desea cambiar los colores SVG de los elementos, consulte los detalles en el artículo Cómo cambiar el color SVG. Aquí aprenderá cómo trabajar con color SVG usando la biblioteca Aspose.SVG for .NET y considerará cómo cambiar el color SVG de los elementos o cambiar el color de fondo en archivos SVG.

Dibujo SVG en un mapa de bits existente

El mapa de bits se puede utilizar como fondo para dibujar. Puede agregar las formas, trazados o texto SVG. Por ejemplo, la siguiente figura se crea agregando un círculo y texto al mapa de bits que actúa como fondo:

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>

El siguiente código C# crea el documento SVG anterior desde cero. Agregamos al documento algunos elementos SVG, como una imagen, texto y un elemento circular, y luego guardamos el documento SVG en un archivo:

  1. Cree un documento SVG usando la clase SVGDocument y acceda al elemento SVG raíz usando la propiedad RootElement.
  2. Cree un elemento <image>, establezca los atributos requeridos y agréguelo al elemento <svg>.
  3. De manera similar, cree un elemento <text> usando la clase SVGTextElement y establezca los atributos requeridos. Utilice la propiedad Style para establecer el tamaño de fuente y el método SetAttribute(name, value) para especificar atributos como x, y y fill.
  4. Cree un elemento <circle> usando la clase SVGCircleElement. Los atributos cx, cy y r definen las coordenadas centrales y el radio del círculo. Otros atributos como stroke, stroke-width, fill y stroke-dasharray se utilizan para diseñar el círculo.
  5. Utilice el método AppendChild() para agregar los elementos SVG creados (imageElement, textElement y circleElement) al final de la lista de elementos secundarios del elemento raíz SVG (svgElement).
  6. Llame al método Save() para guardar el documento SVG en un archivo nombrado en el directorio de salida especificado.
 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    }

Pintamos el círculo SVG con un valor grande de stroke-width. La aplicación del atributo stroke-dasharray convierte el trazo del círculo en una línea discontinua. Al seleccionar valores de las áreas llenas y vacías, puede lograr el efecto visual deseado. Para obtener más información sobre las propiedades de los atributos de estilo, consulte el artículo Rellenos y trazos en SVG.

Texto “Imagen con texto SVG agregado y círculo SVG”

En el capítulo SVG Builder: creación y modificación avanzada de SVG, encontrará una guía para manipular SVG de manera efectiva utilizando la API Aspose.SVG Builder, que cubre aspectos desde la creación de elementos básicos hasta técnicas avanzadas como mixins. y azúcar sintáctico.

Puede descargar los ejemplos completos y los archivos de datos desde GitHub. Encontrará información sobre la descarga desde GitHub y la ejecución de ejemplos en la sección Cómo ejecutar los ejemplos.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.