Создание 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; 1// Create an empty SVG document using C#
2
3// Prepare an output path to save a document
4string documentPath = Path.Combine(OutputDir, "empty.svg");
5
6// Initialize an empty SVG document
7using (SVGDocument document = new SVGDocument())
8{
9 // Work with the SVG document here...
10
11 // Save the document to a file
12 document.Save(documentPath);
13}Более подробную информацию о сохранении файла 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 System.IO;
2using Aspose.Svg;
3using Aspose.Svg.Builder;
4using System.Drawing; 1// Create SVG using Builder API
2
3// Initialize an SVG document
4using (SVGDocument document = new SVGDocument())
5{
6 // Create an <svg> element with specified width, height and viewBox, and add into it other required elements
7 SVGSVGElement svg = new SVGSVGElementBuilder()
8 .Width(100).Height(100)
9 .ViewBox(-21, -21, 42, 42)
10 .AddDefs(def => def
11 .AddRadialGradient(id: "b", cx: .2, cy: .2, r: .5, fx: .2, fy: .2, extend: ev => ev
12 .AddStop(offset: 0, stopColor: Color.FromArgb(0xff, 0xff, 0xFF), stopOpacity: .7)
13 .AddStop(offset: 1, stopColor: Color.FromArgb(0xff, 0xff, 0xFF), stopOpacity: 0)
14 )
15 .AddRadialGradient(id: "a", cx: .5, cy: .5, r: .5, extend: ev => ev
16 .AddStop(offset: 0, stopColor: Color.FromArgb(0xff, 0xff, 0x00))
17 .AddStop(offset: .75, stopColor: Color.FromArgb(0xff, 0xff, 0x00))
18 .AddStop(offset: .95, stopColor: Color.FromArgb(0xee, 0xee, 0x00))
19 .AddStop(offset: 1, stopColor: Color.FromArgb(0xe8, 0xe8, 0x00))
20 )
21 )
22 .AddCircle(r: 20, fill: "url(#a)", stroke: Color.FromArgb(0, 0, 0), extend: c => c.StrokeWidth(.15))
23 .AddCircle(r: 20, fill: "b")
24 .AddG(g => g.Id("c")
25 .AddEllipse(cx: -6, cy: -7, rx: 2.5, ry: 4)
26 .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))
27 )
28 .AddUse(href: "#c", extend: e => e.Transform(t => t.Scale(-1, 1)))
29 .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))
30 .Build(document.FirstChild as SVGSVGElement);
31
32 // Save the SVG document
33 document.Save(Path.Combine(OutputDir, "face.svg"));
34}Этот фрагмент кода создает документ 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; 1// Load SVG asynchronously using C#
2
3Url documentUrl = new Url("https://docs.aspose.com/svg/files/owl.svg");
4ManualResetEvent documentEvent = new ManualResetEvent(false);
5
6SVGDocument document = new SVGDocument();
7
8// Subscribe to the event 'OnReadyStateChange' that will be fired once the document is completely loaded
9document.OnReadyStateChange += (sender, ev) =>
10{
11 if (document.ReadyState == "complete")
12 {
13 // Sets the state of the event to signaled to unblock the main thread
14 documentEvent.Set();
15 }
16};
17
18// Load an SVG document Async
19document.Navigate(documentUrl);
20
21// Blocks the current thread while the document is loading
22documentEvent.WaitOne();
23
24// Work with the documentВы можете загрузить полные примеры и файлы данных с GitHub. О загрузке примеров с GitHub и запуске примеров вы узнаете из раздела Как запускать примеры.