Paint Builder – Configurar SVG Fill y Stroke en C#

¿Qué es PaintBuilder?

Aspose.SVG Builder API permite configurar las propiedades SVG fill y stroke mediante programación con sintaxis fluida. La clase PaintBuilder simplifica la creación de valores paint SVG, incluidos colores sólidos y referencias a paint servers como patterns y gradients, en aplicaciones C#.

La configuración de paint SVG se usa para fondos reutilizables, texturas decorativas, estilos de gráficos, rellenos de iconos y efectos vectoriales. Con builders anidados y métodos encadenados, la generación de SVG es más legible y fácil de mantener.

Este artículo explica cómo usar PaintBuilder, una clase builder para crear valores paint para elementos SVG. Esta clase se usa para especificar los valores de los atributos stroke o fill al aplicar colores, patterns o gradients.

PaintBuilder forma parte de Aspose.SVG Builder API y se usa para configurar valores SVG fill y stroke. Admite varios valores paint SVG:

Builder API utiliza un modelo de configuración fluida que simplifica la creación y el diseño de elementos SVG.

Crear SVG Pattern Fills

Los SVG patterns permiten rellenar formas con elementos gráficos repetidos en lugar de colores sólidos. Los patterns se definen una vez y pueden reutilizarse en varios elementos SVG. En el siguiente ejemplo, PaintServerId() de PaintBuilder establece el valor fill como una referencia a un paint server por su Id.

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Create SVG pattern with polygons and apply as fill to rectangle using C# Builder API
 2
 3using (SVGDocument document = new SVGDocument())
 4{
 5    SVGSVGElement svg = new SVGSVGElementBuilder()
 6        .Width(100, LengthType.Percentage).Height(100, LengthType.Percentage)
 7        .ViewBox(0, 0, 400, 400)
 8        .AddG(g => g
 9            .AddPattern(p => p.Id("stars")
10                .ViewBox(0, 0, 20, 20)
11                .Width(5, LengthType.Percentage)
12                .Height(5, LengthType.Percentage)
13                .PatternUnits(CoordinateUnits.UserSpaceOnUse)
14                .AddPolygon(points: new double[] { 5, 0, 7, 3, 10, 5, 7, 7, 5, 10, 3, 7, 0, 5, 3, 3 }, fill: Color.Teal)
15                .AddPolygon(points: new double[] { 15, 0, 17, 3, 20, 5, 17, 7, 15, 10, 13, 7, 10, 5, 13, 3 }, fill: Color.DarkRed)
16                .AddPolygon(points: new double[] { 15, 10, 17, 13, 20, 15, 17, 17, 15, 20, 13, 17, 10, 15, 13, 13 }, fill: Color.DarkBlue)
17            )
18            .AddRect(r => r.Rect(20, 40, 440, 80).Fill(pt => pt.PaintServerId("stars")))
19            )
20        .Build(document.FirstChild as SVGSVGElement);
21    document.Save(Path.Combine(OutputDir, "pattern-stars.svg"));
22}

En este ejemplo, primero se define un pattern con AddPattern(), combinando polígonos de colores para crear un relleno complejo. El pattern recibe el identificador stars. Luego se aplica a un rectángulo con Fill() y PaintServerId("stars").

Visualización del pattern stars aplicado a un rectángulo SVG.

Aplicar Patterns a formas SVG

Los rellenos con patterns pueden aplicarse a rectángulos, círculos, rutas, polígonos y texto. Cualquier elemento SVG compatible con fill puede usar una referencia a paint server creada con PaintBuilder.

El siguiente ejemplo C# muestra cómo crear SVG patterns y aplicarlos a formas dentro del documento. El código muestra el enfoque de «constructor dentro de constructor», que utiliza varias clases constructoras, donde un constructor se anida dentro de otro para facilitar la construcción de objetos o estructuras complejos y proporcionar un enfoque modular и estructurado para la creación de documentos SVG:

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Create SVG patterns with reusable elements and apply them to circles using C# Builder API
 2
 3using (SVGDocument document = new SVGDocument())
 4{
 5    SVGSVGElement svg = new SVGSVGElementBuilder()
 6        .Width(100, LengthType.Percentage).Height(100, LengthType.Percentage)
 7        .ViewBox(0, 0, 600, 600)
 8        .AddG(g => g
 9            .FontFamily("Arial")
10            .FontSize(10)
11            .AddPattern(p => p.Id("Pat3a")
12                .Rect(0, 0, 20, 20)
13                .PatternUnits(CoordinateUnits.UserSpaceOnUse)
14                .AddRect(r => r.Rect(0, 0, 10, 10).Fill(Color.LightSlateGray))
15                .AddRect(r => r.Rect(10, 0, 10, 10).Fill(Color.Teal))
16                .AddRect(r => r.Rect(0, 10, 10, 10).Fill(Color.DarkRed))
17                .AddRect(r => r.Rect(10, 10, 10, 10).Fill(Color.Gold))
18            )
19            .AddPattern(p => p.Id("Pat3b")
20                .Href("#Pat3a")
21                .Width(23).Height(23)
22            )
23            .AddPattern(p => p.Id("Pat3c")
24                .Href("#Pat3a")
25                .Width(15).Height(15)
26            )
27            .AddCircle(circle => circle.Cx(90).Cy(130).R(70).Fill(pt => pt.PaintServerId("Pat3a")))
28            .AddText(t => t.X(55).Y(50)
29                .AddContent("Pattern #Pat3a")
30            )
31            .AddCircle(circle => circle.Cx(240).Cy(130).R(70).Fill(pt => pt.PaintServerId("Pat3b")))
32            .AddText(t => t.X(205).Y(50)
33                .AddContent("Pattern #Pat3b")
34            )
35            .AddCircle(circle => circle.Cx(390).Cy(130).R(70).Fill(pt => pt.PaintServerId("Pat3c")))
36            .AddText(t => t.X(355).Y(50)
37                .AddContent("Pattern #Pat3c")
38            )
39        )
40        .Build(document.FirstChild as SVGSVGElement);
41    document.Save(Path.Combine(OutputDir, "patterns.svg"));
42}

Visualización del archivo patterns.svg con varios rellenos SVG pattern.

Cómo funciona el Pattern

El elemento <pattern> define una tesela reutilizable que se repite sobre la forma rellenada. En este ejemplo:

El pattern puede reutilizarse en varios elementos SVG referenciando el mismo ID. Dimensiones menores generan repeticiones más densas, mientras que valores mayores aumentan el espaciado.

En el ejemplo, se agregan tres patterns diferentes, llamados Pat3a, Pat3b y Pat3c, al documento SVG.

La altura y la anchura de una tesela en un elemento de pattern definen el tamaño de la unidad de pattern repetida en el documento SVG. Este tamaño determina el aspecto del pattern cuando se aplica a formas o elementos. En el pattern Pat3b, al aumentar la altura y la anchura de la tesela se amplía la unidad de pattern, lo que da lugar a zonas sin rellenar (transparentes). En el pattern Pat3c, al reducir la altura y la anchura de la tesela el pattern parece más denso, creando un efecto visual diferente.

Por lo tanto, ajustar la altura y la anchura de la tesela en un elemento SVG <pattern> permite controlar la densidad y la repetición del pattern dentro del documento SVG y permite crear diversos efectos visuales.

Crear Linear Gradient Fills

Aspose.SVG Builder API permite crear SVG linear gradients reutilizables y aplicarlos a formas SVG mediante programación. Los gradients se usan en fondos, gráficos, botones y elementos decorativos.

 1using Aspose.Svg.Builder;
 2using System.Drawing;
 3using System.IO;
 4
 5using (SVGDocument document = new SVGDocument())
 6{
 7    SVGSVGElement svg = new SVGSVGElementBuilder()
 8        .Width(400).Height(200)
 9        .ViewBox(0, 0, 400, 200)
10        .AddDefs(defs => defs
11            .AddLinearGradient(gradient => gradient
12                .Id("gradientFill")
13                .X1(0, LengthType.Percentage).Y1(0, LengthType.Percentage)
14                .X2(100, LengthType.Percentage).Y2(0, LengthType.Percentage)
15                .AddStop(stop => stop
16                    .Offset(0, StopUnitType.Percentage)
17                    .Attribute("stop-color", "gold"))
18                .AddStop(stop => stop
19                    .Offset(100, StopUnitType.Percentage)
20                    .Attribute("stop-color", "teal"))))
21        .AddRect(rect => rect
22            .Rect(20, 20, 360, 160)
23            .Fill(paint => paint.PaintServerId("gradientFill")))
24        .Build(document.FirstChild as SVGSVGElement);
25
26    document.Save(Path.Combine(OutputDir, "linear-gradient-fill.svg"));
27}

Cómo funciona el Gradient

El ejemplo crea una definición SVG <linearGradient> reutilizable dentro de <defs> y la aplica al relleno de un rectángulo.

Errores comunes y soluciones

ProblemaCausaSolución
El pattern no es visibleID de pattern incorrectoAsegúrese de que PaintServerId() coincida con Id()
El pattern aparece estiradoLa tesela es demasiado grandeAjuste Width() y Height() del pattern
El pattern no se repite bienValor PatternUnits incorrectoUse UserSpaceOnUse si necesita teselas fijas
El fill no se aplicaPattern definido fuera del alcance accesibleDefina patterns antes de aplicarlos

FAQ

1. ¿Qué es un paint server en SVG?
Un paint server es un recurso SVG que proporciona valores fill o stroke. Los más comunes son patterns y gradients referenciados con url(#id).

2. ¿Puedo reutilizar el mismo SVG pattern en varias formas?
Sí. Un SVG pattern puede reutilizarse en varios elementos con el mismo ID mediante PaintServerId().

3. ¿Cuál es la diferencia entre UserSpaceOnUse y ObjectBoundingBox?
UserSpaceOnUse usa coordenadas fijas, mientras que ObjectBoundingBox escala el pattern respecto al tamaño del elemento destino.

4. ¿Por qué mi SVG pattern se ve estirado?
Suele ocurrir si la tesela del pattern es demasiado grande o si el sistema de coordenadas no coincide con el elemento destino.

5. ¿Puedo aplicar SVG patterns al texto?
Sí. Los elementos de texto SVG admiten fill y pueden usar patterns igual que las formas.

6. ¿PaintBuilder admite SVG gradients?
Sí. PaintBuilder admite referencias a paint servers para configurar gradients SVG mediante programación.

Recursos relacionados

Close
Loading

Analyzing your prompt, please hold on...

An error occurred while retrieving the results. Please refresh the page and try again.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.