Создание SVG, загрузка и чтение SVG на C#

Для выполнения любой задачи необходимо создать или загрузить документ. Aspose.SVG для .NET API позволяет создавать документы SVG с нуля, а также загружать существующий SVG из разных источников. API предоставляет класс SVGDocument, который имеет несколько конструкторов, позволяющих создавать новые экземпляры классов. SVGDocument является корнем иерархии SVG DOM, содержит весь контент и полностью основан на спецификациях W3C SVG 2.0 и WHATWG DOM.

Файлы SVG можно создавать и загружать:

В этой статье представлены некоторые примеры создания и загрузки файлов SVG с использованием Aspose.SVG для .NET API. SVGDocument имеет широкий набор перегруженных конструкторов, позволяющих создать пустой документ или загрузить его из файла, URL-адреса, потока и т. д.

Создайте пустой документ SVG

Aspose.SVG для .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 вы узнаете, как редактировать SVG с помощью библиотеки Aspose.SVG for .NET, а также найдете подробные примеры добавления новых элементов к документам SVG и применять фильтры SVG к растровым изображениям.

Создать SVG из строки памяти

Вы можете создать SVG из строкового содержимого, используя конструктор SVGDocument(string, string). Если вам нужно создать документ из пользовательской строки непосредственно в коде и вам не нужно сохранять его в файл, вам может помочь следующий пример: мы создаем SVG-документ, содержащий круг с радиусом 40 пикселей.

 1using Aspose.Svg;
 2...
 3
 4    // Prepare SVG code
 5    var documentContent = "<svg xmlns=\"https://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 документ с использованием SVG Builder API

API SVG Builder предлагает мощный и гибкий способ программного создания документов SVG. Используя класс SVGSVGElementBuilder, разработчики могут легко создавать сложную графику SVG с возможностью детальной настройки. Дополнительную информацию об использовании API SVG Builder вы найдете в статье документации 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. Сгенерированное SVG изображение представляет лицо c улыбкой (смайлик):

Текст «Смайлик — лицо с улыбкой — рендеринг файла face.svg»

Загрузить SVG из файла

Чтобы загрузить SVG из файла bezier-curves.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	}

Загрузите SVG из Интернета

Следующие примеры могут помочь вам создать документ на основе URL-адреса, ссылающегося на XML-файл:

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-адрес, к которому в данный момент невозможно получить доступ, библиотека выдаст исключение DOMException со специальным кодом «NetworkError», чтобы сообщить вам, что выбранный ресурс не может быть найден.

Чтение SVG с асинхронными ресурсами

Если SVG содержит внешние ресурсы, полная загрузка всех ресурсов может занять некоторое время и, следовательно, привести к блокировке основного потока приложения. В асинхронной модели на события Load и ReadyStateChange можно подписаться, чтобы уведомить приложение загрузки о полной загрузке файла SVG, как показано в следующем примере кода. Метод Navigate(Url) класса SVGDocument используется для загрузки документа по указанному 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

Вы можете загрузить полные примеры и файлы данных с GitHub. О загрузке примеров с GitHub и запуске примеров вы узнаете из раздела Как запускать примеры.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.