在 C# 中创建 SVG、加载和读取 SVG
要执行任何任务,您必须创建或加载文档。 Aspose.SVG for .NET API 允许您从头开始构建 SVG 文档以及从不同来源加载现有的 SVG。 API 提供的 SVGDocument 类具有多个构造函数,允许您生成新的类实例。 SVGDocument 是 SVG DOM 层次结构的根,包含整个内容,并且完全基于 W3C SVG 2.0 和 WHATWG DOM 规范。
可以创建和加载 SVG 文件:
- 从头开始作为具有 SVG 结构的空文档,
- 来自用户提供的字符串,
- 来自内存流或文件,
- 来自网络。
本文提供了一些使用 Aspose.SVG for .NET API 创建和加载 SVG 文件的示例。 SVGDocument 有一组广泛的重载构造函数,允许您创建空白文档或从文件、URL、流等加载它。
创建一个空的 SVG 文档
Aspose.SVG for .NET API 提供了 SVGDocument 类,可用于使用其默认构造函数创建空文档。创建文档对象后,稍后可以用 SVG 元素填充它。以下 C# 代码片段显示了如何使用默认的 SVGDocument() 构造函数来创建 SVG 文档。
1using Aspose.Svg;
2...
3
4 // Initialize an empty SVG document
5 using (var document = new SVGDocument())
6 {
7 // Work with the SVG document here...
8 }
如果要将创建的空 SVG 文档保存到文件中,请使用以下 C# 代码片段:
1using Aspose.Svg;
2using System.IO;
3...
4
5 // Prepare output path for a document saving
6 string documentPath = Path.Combine(OutputDir, "empty.svg");
7
8 // Initialize an empty SVG document
9 using (var document = new SVGDocument())
10 {
11 // Work with the SVG document here...
12
13 // Save the document to a file
14 document.Save(documentPath);
15 }
有关 SVG 文件保存的更多详细信息,请参阅 保存 SVG 文档 部分。在文章 编辑 SVG 文件 中,您将了解如何使用 Aspose.SVG for .NET 库编辑 SVG,并找到如何向 SVG 文档添加新元素以及将 SVG 滤镜应用于位图的详细示例。
从内存字符串创建 SVG
您可以使用
SVGDocument (string, string
) 构造函数从字符串内容创建 SVG。如果您的情况是直接在代码中根据用户字符串生成文档,并且不需要将其保存到文件中,则以下示例可以帮助您:我们生成一个 SVG 文档,其中包含半径为 40 的圆像素。
1using Aspose.Svg;
2...
3
4 // Prepare SVG code
5 var documentContent = "<svg xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"50\" cy=\"50\" r=\"40\" /></svg>";
6
7 // Initialize an SVG document from a string content
8 using (var document = new SVGDocument(documentContent, "."))
9 {
10 // Work with the document here...
11 }
从流创建 SVG
要从流创建 SVG,请使用 SVGDocument() 构造函数之一:
1using Aspose.Svg;
2using System.IO;
3...
4
5 //Prepare a path to a file required for a FileStream object creating
6 string documentPath = Path.Combine(DataDir, "bezier-curves.svg");
7
8 // Create a FileStream object
9 using (var stream = new FileStream(documentPath, FileMode.Open, FileAccess.Read))
10 {
11 // Initialize an SVG document from the stream
12 using (var document = new SVGDocument(stream, "."))
13 {
14 // Work with the document
15 }
16 }
使用 SVG Builder API 创建自定义 SVG 文档
SVG Builder API 提供了一种强大且灵活的方式来以编程方式构建 SVG 文档。 通过利用SVGSVGElementBuilder
类,开发人员可以轻松创建具有详细自定义选项的复杂 SVG 图形。 有关使用 SVG Builder API 的更多信息,请参阅文档文章
使用 Aspose.SVG Builder API 进行高级 SVG 创建和修改 。
以下示例演示了如何创建具有各种图形元素的自定义 SVG 文档:
1using Aspose.Svg;
2using Aspose.Svg.Builder;
3using System.Drawing;
4...
5
6 // Initialize an SVG document
7 using (var document = new SVGDocument())
8 {
9 // Create an <svg> element with specified width, height and viewBox, and add into it other required elements
10 var svg = new SVGSVGElementBuilder()
11 .Width(100).Height(100)
12 .ViewBox(-21, -21, 42, 42)
13 .AddDefs(def => def
14 .AddRadialGradient(id: "b", cx: .2, cy: .2, r: .5, fx: .2, fy: .2, extend: ev => ev
15 .AddStop(offset: 0, stopColor: Color.FromArgb(0xff, 0xff, 0xFF), stopOpacity: .7)
16 .AddStop(offset: 1, stopColor: Color.FromArgb(0xff, 0xff, 0xFF), stopOpacity: 0)
17 )
18 .AddRadialGradient(id: "a", cx: .5, cy: .5, r: .5, extend: ev => ev
19 .AddStop(offset: 0, stopColor: Color.FromArgb(0xff, 0xff, 0x00))
20 .AddStop(offset: .75, stopColor: Color.FromArgb(0xff, 0xff, 0x00))
21 .AddStop(offset: .95, stopColor: Color.FromArgb(0xee, 0xee, 0x00))
22 .AddStop(offset: 1, stopColor: Color.FromArgb(0xe8, 0xe8, 0x00))
23 )
24 )
25 .AddCircle(r: 20, fill: "url( #a)", stroke: Color.FromArgb(0, 0, 0), extend: c => c.StrokeWidth(.15))
26 .AddCircle(r: 20, fill: "b")
27 .AddG(g => g.Id("c")
28 .AddEllipse(cx: -6, cy: -7, rx: 2.5, ry: 4)
29 .AddPath(fill: Paint.None, stroke: Color.FromArgb(0, 0, 0), d: "M10.6 2.7a4 4 0 0 0 4 3", extend: e => e.StrokeWidth(.5).StrokeLineCap(StrokeLineCap.Round))
30 )
31 .AddUse(href: "#c", extend: e => e.Transform(t => t.Scale(-1, 1)))
32 .AddPath(d: "M-12 5a13.5 13.5 0 0 0 24 0 13 13 0 0 1-24 0", fill:Paint.None, stroke: Color.FromArgb(0,0,0), extend: e => e.StrokeWidth(.75))
33 .Build(document.FirstChild as SVGSVGElement);
34
35 // Save the SVG document
36 document.Save(OutputFolder + "face.svg");
37 }
此代码片段创建了一个具有复杂设计的 SVG 文档,展示了 SVG Builder API 以编程方式生成自定义 SVG 图形的灵活性和强大功能。 在上面的 C# 代码中,我们创建了一个包含圆形、椭圆、路径和渐变等元素的 SVG 文档。生成的 SVG 图像代表一张微笑的脸(笑脸ы:
从文件加载 SVG
要从文件 bezier-curves.svg 加载 SVG,请使用 SVGDocument 类的默认构造函数,并将文件路径作为输入参数传递给它。
1using Aspose.Svg;
2using System.IO;
3...
4
5 // Prepare a path to a file loading
6 string documentPath = Path.Combine(DataDir, "bezier-curves.svg");
7
8 // Load an SVG document from the file
9 using (var document = new SVGDocument(documentPath))
10 {
11 // Work with the document
12 }
从 Web 加载 SVG
以下示例可以帮助您从引用 XML 文件的 URL 创建文档:
1using Aspose.Svg;
2...
3
4 // Load SVG from the Web at its URL
5 var documentUrl = new Url("https://docs.aspose.com/svg/files/owl.svg");
6 using (var document = new SVGDocument(documentUrl))
7 {
8 // Work with the SVG document here...
9 }
1using Aspose.Svg;
2...
3
4 // Load SVG from the Web at its URL
5 using (var document = new SVGDocument(new Url("https://docs.aspose.com/svg/files/basic-shapes.svg")))
6 {
7 // Work with the SVG document here...
8 }
如果您设置了此时无法正确访问的错误 URL,则库会抛出带有专门代码 NetworkError 的 DOMException,以通知您无法找到所选资源。
使用资源异步读取 SVG
如果 SVG 包含外部资源,则可能需要一些时间才能完全加载所有资源,从而导致主应用程序线程阻塞。在异步模型中,可以订阅 Load 和 ReadyStateChange 事件以通知加载应用程序完成 SVG 文件的加载,如以下代码示例所示。
SVGDocument 类的
Navigate(Url
) 方法用于将指定 URL 处的文档加载到当前实例中。
1using Aspose.Svg;
2using System.Threading;
3...
4
5 var documentUrl = new Url("https://docs.aspose.com/svg/files/owl.svg");
6 var document = new SVGDocument();
7 var documentEvent = new ManualResetEvent(false);
8
9 // Subscribe to the event 'OnReadyStateChange' that will be fired once the document is completely loaded
10 document.OnReadyStateChange += (sender, ev) =>
11 {
12 if (document.ReadyState == "complete")
13 {
14 // Sets the state of the event to signaled to unblock the main thread
15 documentEvent.Set();
16 }
17 };
18 // Load the SVG document Async
19 document.Navigate(documentUrl);
20
21 // Blocks the current thread while the document is loading
22 documentEvent.WaitOne();
23
24 // Work with the document