Создание SVG, загрузка и чтение SVG на C#
Для выполнения любой задачи необходимо создать или загрузить документ. Aspose.SVG для .NET API позволяет создавать документы SVG с нуля, а также загружать существующий SVG из разных источников. API предоставляет класс SVGDocument, который имеет несколько конструкторов, позволяющих создавать новые экземпляры классов. SVGDocument является корнем иерархии SVG DOM, содержит весь контент и полностью основан на спецификациях W3C SVG 2.0 и WHATWG DOM.
Файлы SVG можно создавать и загружать:
- с нуля как пустой документ со структурой 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=\"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 документ с использованием 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 улыбкой (смайлик):
Загрузить 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 и запуске примеров вы узнаете из раздела Как запускать примеры.