Эффект тени – Фильтры SVG – Код C#

SVG фильтры

Aspose.SVG for .NET позволяет открывать, создавать или редактировать документ SVG и вносить изменения в его содержимое. Вы можете применить множество доступных фильтров SVG к элементам или растровым изображениям SVG, чтобы получить желаемый результат. Пространство имен Aspose.Svg.Filters содержит классы и интерфейсы, связанные с эффектами фильтров в спецификации SVG. Чтобы создать эффект тени, вы можете использовать несколько примитивов фильтров:

В этой статье вы узнаете, как написать код SVG для создания фильтра тени, и рассмотрите подробные примеры C# использования пространства имен Aspose.Svg.Filters для применения эффекта тени к элементам или растровым изображениям SVG.

Эффект тени – Drop Shadow – код SVG

Эффект тени в SVG – это распространенный визуальный эффект, используемый для создания иллюзии тени позади элемента SVG. Он обеспечивает глубину и реалистичность содержимого SVG, создавая впечатление, будто элемент плавает над фоном. Кроме того, эффект тени можно использовать, чтобы выделить изображение. Есть несколько способов реализовать эффект тени в SVG. Давайте посмотрим на два из них.

Примечание. В SVG фильтр определяется элементом <filter>, который устанавливается внутри элемента <defs>. Он никогда не отображается сам по себе и концептуально описывается как элемент, включающий в себя дочерние элементы – примитивы фильтра. Элемент <filter> имеет набор атрибутов. Обязательными атрибутами примитива фильтра являются x, y, width, height и id. Они задают область изображения, к которой будет применен фильтр. А атрибут id дает уникальный идентификатор элементу SVG и идентифицирует элемент в документе SVG.

feOffset + feGaussianBlur + feBlend примитивы фильтра

На наш взгляд, наиболее эффективно использовать три фильтра для достижения эффекта тени. Это позволит вам точно настроить эффект, даже если для этого потребуется больше кода:

 1<svg height="200" width="200" xmlns="http://www.w3.org/2000/svg">
 2    <defs>
 3        <filter id="shadow" x="-20" y="-20" height="150" width="150" >
 4            <feOffset result="offset" in="SourceAlpha" dx="10" dy="10" />
 5            <feGaussianBlur result="blur" in="offset" stdDeviation="3" />
 6            <feBlend in="SourceGraphic" in2="blur" mode="normal" />
 7        </filter>
 8    </defs>
 9    <rect x="40" y="40" width="100" height="100" fill="orange" filter="url(#shadow)" />
10</svg>

Для создания эффекта тени используются три фильтра (рис. c):

  1. Примитив фильтра <feOffset> используется для смещения слоя в SVG. Он принимает in="SourceAlpha" и сдвигает результат на 10 пикселей вправо и на 10 пикселей вниз и сохраняет результат в буфере как "offset". Обратите внимание, что в качестве входных данных используется альфа-канал фигуры. Значение SourceAlpha приводит к результату черного цвета (рисунок а).
  2. <feGaussianBlur> принимает in="offset", применяет размытие stdDeviation="3" и сохраняет результат во временном буфере с именем "blur".
  3. Фильтр <feBlend> смешивает два объекта; он принимает два входных сигнала in="SourceGraphic" и in2="blur", а затем смешивает SourceGraphic поверх смещенного черного размытого изображения (рис. b). Его атрибут mode определяет режим смешивания.

На следующем рисунке показано пошаговое создание тени:

Text «Эффект тени для оранжевого прямоугольника – пошаговая иллюстрация»

Примитив фильтра feDropShadow

В SVG эффект тени может быть достигнут с помощью примитива фильтра feDropShadow в элементе <filter>. Элемент <feDropShadow> имеет атрибуты, необходимые для создания тени, такие как dx, dy и stdDeviation, а также позволяет добавлять цвет и прозрачность к тени! Это достигается с помощью атрибутов flood-color и flood-opacity. Давайте посмотрим, как создать эффект тени, используя примитив фильтра feDropShadow:

1<svg height="200" width="200" xmlns="http://www.w3.org/2000/svg">
2	<defs>
3        <filter id="shadow-red" x="-20" y="-20" height="100" width="100" >
4			<feDropShadow dx="10" dy="10" stdDeviation="3"  flood-color="CornflowerBlue" />
5		</filter>
6	</defs>
7    <rect x="40" y="40" width="100" height="100" fill="orange" filter="url(#shadow-red)" />
8</svg>

Text «Эффект тени для оранжевого прямоугольника с цветной тенью»

Примечание. Если атрибут flood-color не указан или указан неправильно, то тень по умолчанию будет черной.

Эффект тени – код C#

Здесь мы напишем код С# для создания эффекта тени для оранжевого прямоугольника с помощью трех примитивов фильтра.

В следующем фрагменте кода показано, как создать эффект тени с помощью API Aspose.SVG для .NET.

  1. Используйте конструктор SVGDocument(), чтобы создать пустой документ SVG.
  2. Свойство RootElement класса SVGDocument указывает на корневой элемент документа <svg>.
  3. Создайте элемент <defs> и добавьте его к элементу <svg>:
    • Используйте метод CreateElementNS(), чтобы создать экземпляр класса SVGDefsElement.
    • Используйте метод AppendChild(), чтобы добавить элемент <defs> к элементу <svg>.
  4. Создайте элемент <filter>, установите атрибуты и добавьте его к элементу <defs>:
    • Используйте метод CreateElementNS() класса SVGDocument, чтобы создать экземпляр класса SVGFilterElement.
    • Вызовите метод SetAttribute(name, value), чтобы установить атрибуты x, y, height и width.
    • Не забудьте установить атрибут id.
    • Используйте метод AppendChild(), чтобы добавить <filter> к элементу <defs>.
  5. Создайте элемент <feOffset>, установите атрибуты и добавьте его к элементу <filter>:
    • Используйте метод CreateElementNS() класса SVGDocument, чтобы создать экземпляр класса SVGFEOffsetElement.
    • Вызовите метод SetAttribute(name, value), чтобы установить атрибуты dx, dy и result.
    • Не забудьте установить атрибут in1. Используйте свойство типа SVGAnimatedLength, статические данные для которого можно задать или прочитать через конструкцию feOffsetElement.In1.BaseVal = "SourceAlpha".
    • Используйте метод AppendChild(), чтобы добавить <feOffset> к элементу <filter>.
  6. Аналогичным образом создайте, задайте атрибуты и добавьте к элементу <filter> такие элементы, как <feGaussianBlur> и <feBlend>.
  7. Создайте прямоугольный элемент <rect>, который будет фигурой SVG с эффектом тени. Ему присваивается цвет заливки (#ffa500 – оранжевый), а атрибуту filter присваивается значение "url(#shadow)", ссылаясь на ранее определенный фильтр с Id = "shadow".
  8. Вызовите метод Save(), чтобы сохранить документ с фильтром тени в локальный файл.
1using Aspose.Svg;
2using System.IO;
3using Aspose.Svg.Filters;
 1// Apply drop shadow effect for an SVG rectangle using C#
 2
 3// Set SVG Namespace Url
 4string SvgNamespace = "http://www.w3.org/2000/svg";
 5
 6// Initialize an SVG document
 7using (SVGDocument document = new SVGDocument())
 8{
 9    SVGSVGElement svgElement = document.RootElement;
10
11    // Create a <defs> element and add it to the svgElement
12    SVGDefsElement defsElement = (SVGDefsElement)document.CreateElementNS(SvgNamespace, "defs");
13    svgElement.AppendChild(defsElement);
14
15    // Create a <filter> element and add it to the defsElement
16    SVGFilterElement filterElement = (SVGFilterElement)document.CreateElementNS(SvgNamespace, "filter");
17    filterElement.Id = "shadow";
18    filterElement.SetAttribute("x", "-20px");
19    filterElement.SetAttribute("y", "-20px");
20    filterElement.SetAttribute("height", "150px");
21    filterElement.SetAttribute("width", "150px");
22    defsElement.AppendChild(filterElement);
23
24    // Create a <feOffset> filter primitive and add it to the filterElement
25    SVGFEOffsetElement feOffsetElement = (SVGFEOffsetElement)document.CreateElementNS(SvgNamespace, "feOffset");
26    feOffsetElement.In1.BaseVal = "SourceAlpha";
27    feOffsetElement.SetAttribute("result", "offset");
28    feOffsetElement.SetAttribute("dx", "10");
29    feOffsetElement.SetAttribute("dy", "10");
30    filterElement.AppendChild(feOffsetElement);
31
32    // Create a <feGaussianBlur> filter primitive and add it to the filterElement
33    SVGFEGaussianBlurElement feGaussianBlurElement = (SVGFEGaussianBlurElement)document.CreateElementNS(SvgNamespace, "feGaussianBlur");
34    feGaussianBlurElement.In1.BaseVal = "offset";
35    feGaussianBlurElement.StdDeviationX.BaseVal = 3;
36    feGaussianBlurElement.StdDeviationY.BaseVal = 3;
37    feGaussianBlurElement.SetAttribute("result", "blur");
38    filterElement.AppendChild(feGaussianBlurElement);
39
40    // Create a <feBlend> filter primitive and add it to the filterElement
41    SVGFEBlendElement feBlendElement = (SVGFEBlendElement)document.CreateElementNS(SvgNamespace, "feBlend");
42    feBlendElement.In1.BaseVal = "SourceGraphic";
43    feBlendElement.In2.BaseVal = "blur";
44    feBlendElement.SetAttribute("mode", "normal");
45    filterElement.AppendChild(feBlendElement);
46
47    // Create a <rect> element and set the "fill" and "filter" attributes
48    SVGRectElement rectElement = (SVGRectElement)document.CreateElementNS(SvgNamespace, "rect");
49    rectElement.X.BaseVal.Value = 40;
50    rectElement.Y.BaseVal.Value = 40;
51    rectElement.Width.BaseVal.Value = 100;
52    rectElement.Height.BaseVal.Value = 100;
53    rectElement.SetAttribute("fill", "#ffa500");
54    rectElement.SetAttribute("filter", "url(#shadow)");
55    svgElement.InsertBefore(rectElement, svgElement.FirstChild);
56
57    // Save the document
58    document.Save(Path.Combine(OutputDir, "drop-shadow-effect.svg"));
59}

Когда вы запустите этот код C#, он создаст файл SVG с эффектом тени для оранжевого прямоугольника. Тень будет черного цвета, смещенная на 10 единиц по горизонтали и 10 единиц по вертикали от исходного прямоугольника. Полученный файл drop-shadow-effect.svg выглядит как рисунок c – оранжевый прямоугольник с черной тенью.

Эффект тени с использованием API SVG Builder

API Aspose.SVG Builder предназначен для упрощенного создания и редактирования элементов SVG на C#. Давайте рассмотрим С#-пример реализации эффекта тени (точно тот же пример, что и в предыдущем параграфе) с использованием SVG Builder API. Следующий код демонстрирует использование шаблона свободного компоновщика (fluent builder pattern) для создания кратких и читаемых документов SVG, используя возможности библиотеки Aspose.SVG:

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Create an SVG <rect> with drop shadow using SVG Builder in C#
 2
 3// Initialize an SVG document
 4using (SVGDocument document = new SVGDocument())
 5{
 6    // Create an instance of SVGSVGElementBuilder to facilitate the construction of the <svg> element and its child elements using a fluent builder pattern
 7    SVGSVGElement svg = new SVGSVGElementBuilder()
 8        //.Width(400).Height(400)
 9        .AddDefs(d => d
10            .AddFilter(f => f.Id("shadow").Width(150).Height(150)
11                .AddFeDropShadow(sh => sh
12                    .Dx(10).Dy(10)
13                    .StdDeviation(3)
14                )
15            )
16        )
17        .AddRect(r => r
18            .Rect(40, 40, 100, 100)
19            .Filter(f => f.FilterId("shadow"))
20            .Style(s => s.Fill(Color.Orange))
21        )
22        // Call the Build() method on the SVGSVGElementBuilder to construct the <svg> element with its child elements
23        .Build(document.FirstChild as SVGSVGElement);
24    //.Build(document.FirstChild as SVGSVGElement);
25    document.Save(Path.Combine(OutputDir, "drop-shadow-builder.svg"));
26}

Шаблон Fluent builder позволяет создавать элементы SVG и применять фильтры более лаконичным и удобочитаемым способом. Каждый вызов метода, например .AddFilter или .AddRect, четко указывает его цель, позволяя с первого взгляда понять структуру документа SVG. Этот пример демонстрирует более выразительный подход к созданию документов SVG с помощью SVG Builder, обеспечивающий улучшенную читаемость, удобство обслуживания и гибкость по сравнению с ручным подходом к созданию элементов, показанным в предыдущем примере. В результате работы кода мы получаем тот самый оранжевый прямоугольник с черной тенью:

Text “Эффект тени для оранжевого прямоугольника – визуализация файла drop-shadow-builder.svg”

Текст c тенью – Text Drop Shadow

В этом примере C# создается файл SVG, аналогичный тому, который мы видели ранее в разделе примитив фильтра feDropShadow. Только здесь мы используем примитив фильтра feDropShadow для создания цветной тени для текста SVG, а не для оранжевого прямоугольника.

В следующем фрагменте кода показано, как создать тень текста с помощью API Aspose.SVG для .NET:

1using Aspose.Svg;
2using System.IO;
3using Aspose.Svg.Filters;
 1// Add a colored drop shadow effect to <text> in SVG programmatically
 2
 3// Set SVG Namespace Url
 4string SvgNamespace = "http://www.w3.org/2000/svg";
 5
 6// Initialize an SVG document
 7using (SVGDocument document = new SVGDocument())
 8{
 9    SVGSVGElement svgElement = document.RootElement;
10
11    // Create a <defs> element and add it to the svgElement
12    SVGDefsElement defsElement = (SVGDefsElement)document.CreateElementNS(SvgNamespace, "defs");
13    svgElement.AppendChild(defsElement);
14
15    // Create a <filter> element and add it to the defsElement
16    SVGFilterElement filterElement = (SVGFilterElement)document.CreateElementNS(SvgNamespace, "filter");
17    filterElement.Id = "text-shadow";
18    filterElement.SetAttribute("x", "-20px");
19    filterElement.SetAttribute("y", "-20px");
20    filterElement.SetAttribute("height", "150px");
21    filterElement.SetAttribute("width", "150px");
22    defsElement.AppendChild(filterElement);
23
24    // Create a <feDropShadow> filter primitive and add it to the filterElement
25    SVGFEDropShadowElement feDropShadowElement = (SVGFEDropShadowElement)document.CreateElementNS(SvgNamespace, "feDropShadow");
26    feDropShadowElement.StdDeviationX.BaseVal = 3;
27    feDropShadowElement.StdDeviationY.BaseVal = 3;
28    feDropShadowElement.SetAttribute("dx", "3");
29    feDropShadowElement.SetAttribute("dy", "3");
30    feDropShadowElement.SetAttribute("flood-color", "LightCoral");
31    filterElement.AppendChild(feDropShadowElement);
32
33    // Create a <text> element and add it to the svgElement
34    SVGTextElement textElement = (SVGTextElement)document.CreateElementNS(SvgNamespace, "text");
35    textElement.Style.FontSize = "4em";
36    textElement.SetAttribute("x", "20px");
37    textElement.SetAttribute("fill", "CornflowerBlue");
38    textElement.SetAttribute("y", "100px");
39    textElement.TextContent = "Drop Shadow Effect";
40    textElement.SetAttribute("filter", "url(#text-shadow)");
41    svgElement.InsertBefore(textElement, svgElement.FirstChild);
42
43    // Save the document
44    document.Save(Path.Combine(OutputDir, "text-drop-shadow.svg"));
45}

Тень текста – использование SVG Builder

Точно такой же пример для текста с цветной тенью, но мы реализуем его с помощью Aspose.SVG Builder:

1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
 1// Add a colored drop shadow effect to <text> in SVG using SVG Builder
 2
 3// Initialize an SVG document
 4using (SVGDocument document = new SVGDocument())
 5{
 6    // Create an instance of SVGSVGElementBuilder to facilitate the construction of the <svg> element and its child elements using a fluent builder pattern
 7    SVGSVGElement svg = new SVGSVGElementBuilder()
 8        .AddDefs(d => d
 9            .AddFilter(f => f.Id("shadow").Width(150).Height(150)
10                .AddFeDropShadow(sh => sh
11                    .Dx(3).Dy(3)
12                    .StdDeviation(3)
13                    .FloodColor(Color.LightCoral)
14                )
15            )
16        )
17        .AddText(t => t.X(20).Y(100).Fill(Color.CornflowerBlue).FontSize(48, LengthType.Pt)
18            .Filter(f => f.FilterId("shadow"))
19            .AddContent("Drop Shadow Effect")
20        )
21
22        // Call the Build() method on the SVGSVGElementBuilder to construct the <svg> element with its child elements
23        .Build(document.FirstChild as SVGSVGElement);
24    document.Save(Path.Combine(OutputDir, "text-drop-shadow-builder.svg"));
25}

Полученные изображения text-drop-shadow.svg и text-drop-shadow-builder.svg выглядят следующим образом:

Text «К тексту применен эффект тени – Эффект тени»

Текст имеет тень с цветом заливки LightCoral и радиусом размытия 3 единицы. Тень будет смещена на 3 единицы по горизонтали и на 3 единицы по вертикали от текста, создавая визуально привлекательный эффект тени.

Смотрите также

  • Дополнительную информацию о примитивах фильтров вы найдете в W3C Filter Effects Module.
  • Если вам интересно, как написать SVG-код для создания фильтров SVG, размытия по Гауссу, эффектов тени, эффектов освещения или линейного и радиального градиента, посетите статью Фильтры и градиенты SVG.
  • Вы можете загрузить полные примеры и файлы данных с GitHub.
  • О загрузке с GitHub и запуске примеров вы узнаете из раздела Как запускать примеры.
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.