Paint Builder – 在 C# 中配置 SVG Fill 和 Stroke

什么是 PaintBuilder?

Aspose.SVG Builder API 允许开发人员使用 fluent syntax 以编程方式配置 SVG 的 fillstroke 属性。 PaintBuilder 类简化了 SVG paint values 的创建,包括纯色以及对 patterns 和 gradients 等 paint servers 的引用。

SVG paint configuration 常用于可复用背景、装饰纹理、图表样式、图标填充和矢量图形效果。通过嵌套 builders 和链式配置方法,SVG 生成更易读、更易维护。

本文介绍如何使用 PaintBuilder 为 SVG 元素创建 paint values。该类用于在应用颜色、patterns 或 gradients 时指定 SVG 形状和元素的 strokefill 属性值。

PaintBuilder 是 Aspose.SVG Builder API 的一部分,用于配置 SVG 的 fillstroke 值。它支持多种 SVG paint values:

Builder API 使用一种 fluent configuration 模型,可简化 SVG 元素的创建和样式设置。

创建 SVG Pattern Fills

SVG patterns 允许使用重复的图形元素填充形状,而不是使用纯色。Pattern 只需定义一次,就可以在多个 SVG 元素中复用。在下面的示例中,PaintBuilder 类的 PaintServerId() 方法将 fill 值设置为按 Id 引用 paint server。

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}

在此示例中,首先使用 AddPattern() 定义一个 pattern,将多个彩色多边形组合成复杂填充。该 pattern 的标识符为 stars,随后通过 Fill()PaintServerId("stars") 应用于矩形。

应用到 SVG 矩形的 stars pattern 可视化。

将 Patterns 应用于 SVG 形状

Pattern fills 可应用于矩形、圆、路径、多边形和文本元素。任何支持 fill 的 SVG 元素都可以使用由 PaintBuilder 创建的 paint server 引用。

以下 C# 示例展示如何创建 SVG patterns 并将其应用到文档中的形状。该代码展示了“builder 中的 builder”方法,该方法使用多个 builder 类,其中一个 builder 嵌套在另一个 builder 中,以方便构建复杂的对象或结构,并为 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}

包含多个 SVG pattern fills 的 patterns.svg 文件可视化。

Pattern 如何工作

<pattern> 元素定义一个可复用的图块,该图块会在填充的形状中重复。在此示例中:

Pattern 可以通过引用同一个 pattern ID 在多个 SVG 元素中复用。较小的 pattern 尺寸会产生更密集的重复,较大的值会增加重复元素之间的间距。

在此示例中,向 SVG 文档添加了三个不同的 pattern,分别命名为 Pat3a、Pat3b 和 Pat3c。

pattern 元素中图块的高度和宽度定义了 SVG 文档中重复 pattern 单元的大小。该大小决定了 pattern 在应用于形状或元素时的外观。在 pattern Pat3b 中,增加图块的高度和宽度会放大 pattern 单元,从而导致出现未填充(透明)的区域。在 pattern Pat3c 中,减小图块的高度和宽度会使 pattern 看起来更密集,从而产生不同的视觉效果。

因此,调整 SVG <pattern> 元素中图块的高度和宽度可让您控制 SVG 文档中 pattern 的密度和重复,并能够创建多样化的视觉效果。

创建 Linear Gradient Fills

Aspose.SVG Builder API 允许创建可复用的 SVG linear gradients,并以编程方式将其应用到 SVG 形状。Gradients 常用于背景、图表、按钮和装饰图形。

 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}

Gradient 如何工作

示例在 <defs> 中创建可复用的 SVG <linearGradient> 定义,并将其应用于矩形填充。

常见错误和修复

问题原因修复方法
Pattern 不可见Pattern ID 不正确确保 PaintServerId()Id() 匹配
Pattern 看起来被拉伸图块大小过大调整 pattern 的 Width()Height()
Pattern 无法正确重复PatternUnits 值不正确需要固定图块时使用 UserSpaceOnUse
Fill 未应用Pattern 定义在不可访问范围之外在应用之前定义 patterns

FAQ

1. SVG 中的 paint server 是什么?
Paint server 是提供 fillstroke 值的 SVG 资源。常见 paint servers 包括通过 url(#id) 引用的 patterns 和 gradients。

2. 可以将同一个 SVG pattern 用于多个形状吗?
可以。通过 PaintServerId() 引用同一个 ID,一个 SVG pattern 可用于多个元素。

3. UserSpaceOnUse 和 ObjectBoundingBox 有什么区别?
UserSpaceOnUse 使用固定坐标,而 ObjectBoundingBox 会根据目标元素大小缩放 pattern。

4. 为什么 SVG pattern 看起来被拉伸?
通常是因为 pattern 图块过大,或坐标系统与目标 SVG 元素尺寸不匹配。

5. 可以将 SVG patterns 应用于文本元素吗?
可以。SVG 文本元素支持 fill,可以像形状一样使用 pattern fills。

6. PaintBuilder 支持 SVG gradients 吗?
支持。PaintBuilder 支持 paint server 引用,用于以编程方式配置 SVG gradient fills。

Related Resources

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.