Sombra paralela (Drop Shadow) – Filtros SVG – Código C#
Filtros SVG
Aspose.SVG for .NET le permite abrir, crear o editar un documento SVG y realizar cambios en su contenido. Puede aplicar muchos filtros SVG disponibles para elementos SVG o mapas de bits para obtener el resultado deseado. El espacio de nombres Aspose.Svg.Filters contiene clases e interfaces relacionadas con efectos de filtro en la especificación SVG. Para crear un efecto de sombra paralela, puede utilizar algunas primitivas de filtro:
- la clase
SVGFEDropShadowElement para crear un elemento
<feDropShadow>
para implementar el efecto de sombra paralela; - la clase
SVGFEOffsetElement para crear un elemento
<feOffset>
para compensar una capa en SVG; - la clase
SVGFEGaussianBlurElement corresponde a un elemento
<feGaussianBlur>
para implementar el efecto Desenfoque Gaussiano; - el
SVGFEBlendElement para crear un elemento
<feBlend>
para combinar dos o más objetos.
En este artículo, aprenderá a escribir código SVG para crear un filtro de sombra paralela y considerará ejemplos detallados de C# sobre el uso del espacio de nombres Aspose.Svg.Filters para aplicar el efecto de sombra paralela a elementos SVG o mapas de bits.
Sombra paralela (Drop Shadow) – Código SVG
El efecto de sombra en SVG es un efecto visual común que se utiliza para crear la ilusión de una sombra detrás de un elemento SVG. Proporciona profundidad y realismo al contenido SVG al hacer que parezca que el elemento flota sobre el fondo. Además, se puede utilizar un efecto de sombra paralela para resaltar una imagen. Hay varias formas de implementar el efecto de sombra en SVG. Veamos dos de ellos.
Nota: En SVG, el filtro se define por el elemento <filter>
, que se establece dentro de un elemento <defs>
. Nunca se representa en sí mismo y se describe conceptualmente como el elemento que incluye a sus hijos: primitivos de filtro. El elemento <filter>
tiene un conjunto de atributos. Los atributos requeridos para el filtro primitivo son x, y, width, height
e id
. Establecen el área de la imagen a la que se aplicará el filtro. Y el atributo id
proporciona un identificador único a un elemento SVG e identifica un elemento dentro de un documento SVG.
Primitivas de filtro feOffset
+ feGaussianBlur
+ feBlend
En nuestra opinión, lo más efectivo es utilizar tres filtros para conseguir el efecto de sombra. Esto le permitirá ajustar el efecto aunque requiera más código:
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>
Se utilizan tres filtros para crear un efecto de sombra paralela (figura c):
- La primitiva de filtro
<feOffset>
se utiliza para compensar una capa en SVG. Tomain="SourceAlpha"
, desplaza el resultado 10 px hacia la derecha y 10 px hacia abajo, y almacena el resultado en el búfer como"offset"
. Tenga en cuenta que el canal alfa de la forma se utiliza como entrada. El valorSourceAlpha
conduce a un resultado de color negro (figura a). <feGaussianBlur>
tomain="offset"
, aplica un desenfoque destdDeviation="3"
y almacena el resultado en un búfer temporal llamado"blur"
.- El filtro
<feBlend>
combina dos objetos; se necesitan dos entradasin="SourceGraphic"
ein2="blur"
y luego se combina elSourceGraphic
encima de la imagen borrosa en negro desplazada (figura b). Su atributomode
especifica el modo de fusión.
La siguiente figura ilustra paso a paso la creación de la sombra paralela:
Primitiva de filtro feDropShadow
En SVG, el efecto de sombra se puede lograr usando la primitiva de filtro feDropShadow
en el elemento <filter>
. El elemento <feDropShadow>
tiene los atributos necesarios para crear la sombra paralela, como dx, dy
y stdDeviation
, ¡además te permite agregar color y transparencia a la sombra paralela! Esto se logra utilizando los atributos flood-color
y flood-opacity
. Veamos cómo crear un efecto de sombra usando la primitiva de filtro 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>
Nota: si el atributo “color de inundación” no se especifica o se especifica incorrectamente, la sombra predeterminada será negra.
Sombra paralela – Código C#
Aquí escribiremos el código С# para crear un efecto de sombra paralela para un rectángulo naranja usando tres primitivas de filtro.
El siguiente fragmento de código muestra cómo crear un efecto de sombra paralela utilizando Aspose.SVG for .NET API.
- Utilice el constructor SVGDocument() para crear un documento SVG vacío.
- La propiedad
RootElement
de la clase SVGDocument apunta al elemento raíz<svg>
del documento. - Cree un elemento
<defs>
y agréguelo al elemento<svg>
:- Utilice el método CreateElementNS() para crear una instancia de la clase SVGDefsElement.
- Utilice el método
AppendChild() para agregar el elemento
<defs>
al elemento<svg>
.
- Cree un elemento
<filter>
, establezca atributos y agréguelo al elemento<defs>
:- Utilice el método CreateElementNS() de la clase SVGDocument para crear una instancia de la clase SVGFilterElement.
- Llame al método
SetAttribute(
name, value
) para establecer los atributosx, y, height,
ywidth
. - No olvides establecer el atributo
id
. - Utilice el método AppendChild() para agregar el
<filter>
al elemento<defs>
.
- Cree un elemento
<feOffset>
, establezca atributos y agréguelo al elemento<filter>
:- Utilice el método CreateElementNS() de la clase SVGDocument para crear una instancia de la clase SVGFEOffsetElement.
- Llame al método SetAttribute() para establecer los atributos
dx, dy
yresult
. - No olvides configurar el atributo
in1
. Utilice la propiedad del tipo SVGAnimatedLength, cuyos datos estáticos se pueden configurar o leer a través de la construcciónfeOffsetElement.In1.BaseVal = "SourceAlpha"
. - Utilice el método AppendChild() para agregar
<feOffset>
al elemento<filter>
.
- De manera similar, cree, establezca atributos y agregue al elemento
<filter>
elementos como<feGaussianBlur>
y<feBlend>
. - Cree un elemento rectangular
<rect>
que será una forma SVG con un efecto de sombra paralela. Se le asigna un color defill
(#ffa500 – naranja) y el atributofilter
se establece en"url(#shadow),"
, haciendo referencia al filtro previamente definido conId = "shadow"
. - Llame al método Save() para guardar el documento con el filtro de sombra paralela en un archivo local especificado por la ruta.
1using Aspose.Svg;
2using System.IO;
3using Aspose.Svg.Filters;
4...
5 // Set SVG Namespace Url
6 string SvgNamespace = "http://www.w3.org/2000/svg";
7
8 using (var document = new SVGDocument())
9 {
10 var svgElement = document.RootElement;
11
12 // Create a <defs> element and add to the svgElement
13 var defsElement = (SVGDefsElement)document.CreateElementNS(SvgNamespace, "defs");
14 svgElement.AppendChild(defsElement);
15
16 // Creating a <filter> element and add to the defsElement
17 var filterElement = (SVGFilterElement)document.CreateElementNS(SvgNamespace, "filter");
18 filterElement.Id = "shadow";
19 filterElement.SetAttribute("x", "-20px");
20 filterElement.SetAttribute("y", "-20px");
21 filterElement.SetAttribute("height", "150px");
22 filterElement.SetAttribute("width", "150px");
23 defsElement.AppendChild(filterElement);
24
25 // Create a <feOffset> filter primitive and add it to the filterElement
26 var feOffsetElement = (SVGFEOffsetElement)document.CreateElementNS(SvgNamespace, "feOffset");
27 feOffsetElement.In1.BaseVal = "SourceAlpha";
28 feOffsetElement.SetAttribute("result", "offset");
29 feOffsetElement.SetAttribute("dx", "10");
30 feOffsetElement.SetAttribute("dy", "10");
31 filterElement.AppendChild(feOffsetElement);
32
33 // Create a <feGaussianBlur> filter primitive and add it to the filterElement
34 var feGaussianBlurElement = (SVGFEGaussianBlurElement)document.CreateElementNS(SvgNamespace, "feGaussianBlur");
35 feGaussianBlurElement.In1.BaseVal = "offset";
36 feGaussianBlurElement.StdDeviationX.BaseVal = 3;
37 feGaussianBlurElement.StdDeviationY.BaseVal = 3;
38 feGaussianBlurElement.SetAttribute("result", "blur");
39 filterElement.AppendChild(feGaussianBlurElement);
40
41 // Create a <feBlend> filter primitive and add it to the filterElement
42 var feBlendElement = (SVGFEBlendElement)document.CreateElementNS(SvgNamespace, "feBlend");
43 feBlendElement.In1.BaseVal = "SourceGraphic";
44 feBlendElement.In2.BaseVal = "blur";
45 feBlendElement.SetAttribute("mode", "normal");
46 filterElement.AppendChild(feBlendElement);
47
48 // Create a <rect> element and set the "fill" and "filter" attributes
49 var rectElement = (SVGRectElement)document.CreateElementNS(SvgNamespace, "rect");
50 rectElement.X.BaseVal.Value = 40;
51 rectElement.Y.BaseVal.Value = 40;
52 rectElement.Width.BaseVal.Value = 100;
53 rectElement.Height.BaseVal.Value = 100;
54 rectElement.SetAttribute("fill", "#ffa500");
55 rectElement.SetAttribute("filter", "url(#shadow)");
56 svgElement.InsertBefore(rectElement, svgElement.FirstChild);
57
58 // Save the document
59 document.Save(Path.Combine(OutputDir, "drop-shadow-effect.svg"));
60 }
Cuando ejecute este código C#, generará un archivo SVG con un efecto de sombra paralela para un rectángulo naranja. La sombra será de color negro, desplazada 10 unidades horizontalmente y 10 unidades verticalmente desde el rectángulo de origen. El archivo drop-shadow-effect.svg resultante se parece a la figura c: un rectángulo naranja con una sombra negra.
Efecto de sombra paralela utilizando la API SVG Builder
Aspose.SVG Builder API está diseñada para simplificar la creación y actualización de elementos SVG en C#. Veamos un ejemplo de С# para implementar el efecto de sombra paralela (exactamente el mismo ejemplo que en el párrafo anterior) usando SVG Builder API. Este código muestra el uso de un patrón de creación fluido para crear documentos SVG concisos y legibles, aprovechando las capacidades de la biblioteca Aspose.SVG:
1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
4...
5
6 using (var document = new SVGDocument())
7 {
8 // Create an instance of SVGSVGElementBuilder to facilitate the construction of the <svg> element and its child elements using a fluent builder pattern
9 var svg = new SVGSVGElementBuilder()
10 .Width(400).Height(400)
11 .AddDefs(d => d
12 .AddFilter(f => f.Id("shadow").Width(150).Height(150)
13 .AddFeDropShadow(sh => sh
14 .Dx(10).Dy(10)
15 .StdDeviation(3)
16 )
17 )
18 )
19 .AddRect(r => r
20 .Rect(40, 40, 100, 100)
21 .Filter(f => f.FilterId("shadow"))
22 .Style(s => s.Fill(Color.Orange))
23 )
24 //Call the Build() method on the SVGSVGElementBuilder to construct the <svg> element with its child elements
25 .Build(document.FirstChild as SVGSVGElement);
26 document.Save(Path.Combine(OutputDir, "drop-shadow-builder.svg"));
27 }
El patrón de creación fluido le permite crear elementos SVG y aplicar filtros de una manera más concisa y legible. Cada llamada a un método, como .AddFilter() o .AddRect(), establece claramente su propósito, lo que le permite comprender la estructura del documento SVG de un vistazo. Este ejemplo demuestra un enfoque más expresivo para crear documentos SVG usando SVG Builder, proporcionando legibilidad, mantenibilidad y flexibilidad mejoradas en comparación con el enfoque manual de creación de elementos que se muestra en el ejemplo anterior. Como resultado de la ejecución del código, obtenemos el mismo rectángulo naranja con una sombra negra:
Sombra paralela de texto
Este ejemplo de C# crea un archivo SVG similar al que vimos anteriormente en la sección
primitiva de filtro feDropShadow
. Solo que aquí usamos la primitiva de filtro feDropShadow
para crear una sombra de color para un texto SVG, no para el rectángulo naranja.
El siguiente fragmento de código muestra cómo crear una sombra de texto usando Aspose.SVG for .NET API:
1using Aspose.Svg;
2using System.IO;
3using Aspose.Svg.Filters;
4...
5
6 // Set SVG Namespace Url
7 string SvgNamespace = "http://www.w3.org/2000/svg";
8
9 using (var document = new SVGDocument())
10 {
11 var svgElement = document.RootElement;
12
13 // Create a <defs> element and add to the svgElement
14 var defsElement = (SVGDefsElement)document.CreateElementNS(SvgNamespace, "defs");
15 svgElement.AppendChild(defsElement);
16
17 // Creating a <filter> element and add to the defsElement
18 var filterElement = (SVGFilterElement)document.CreateElementNS(SvgNamespace, "filter");
19 filterElement.Id = "text-shadow";
20 filterElement.SetAttribute("x", "-20px");
21 filterElement.SetAttribute("y", "-20px");
22 filterElement.SetAttribute("height", "150px");
23 filterElement.SetAttribute("width", "150px");
24 defsElement.AppendChild(filterElement);
25
26 // Create a <feDropShadow> filter primitive and add it to the filterElement
27 var feDropShadowElement = (SVGFEDropShadowElement)document.CreateElementNS(SvgNamespace, "feDropShadow");
28 feDropShadowElement.StdDeviationX.BaseVal = 3;
29 feDropShadowElement.StdDeviationY.BaseVal = 3;
30 feDropShadowElement.SetAttribute("dx", "3");
31 feDropShadowElement.SetAttribute("dy", "3");
32 feDropShadowElement.SetAttribute("flood-color", "LightCoral");
33 filterElement.AppendChild(feDropShadowElement);
34
35 // Create a <text> element and add it to the svgElement
36 var textElement = (SVGTextElement)document.CreateElementNS(SvgNamespace, "text");
37 textElement.Style.FontSize = "4em";
38 textElement.SetAttribute("x", "20px");
39 textElement.SetAttribute("fill", "CornflowerBlue");
40 textElement.SetAttribute("y", "100px");
41 textElement.TextContent = "Drop Shadow Effect";
42 textElement.SetAttribute("filter", "url(#text-shadow)");
43 svgElement.InsertBefore(textElement, svgElement.FirstChild);
44
45 // Save the document
46 document.Save(Path.Combine(OutputDir, "text-drop-shadow.svg"));
47 }
Sombra paralela de texto: uso de SVG Builder
Exactamente el mismo ejemplo para texto con una sombra de color, pero lo implementamos usando Aspose.SVG Builder:
1using Aspose.Svg.Builder;
2using System.Drawing;
3using System.IO;
4...
5
6 using (var document = new SVGDocument())
7 {
8 // Create an instance of SVGSVGElementBuilder to facilitate the construction of the <svg> element and its child elements using a fluent builder pattern
9 var svg = new SVGSVGElementBuilder()
10 .AddDefs(d => d
11 .AddFilter(f => f.Id("shadow").Width(150).Height(150)
12 .AddFeDropShadow(sh => sh
13 .Dx(3).Dy(3)
14 .StdDeviation(3)
15 .FloodColor(Color.LightCoral)
16 )
17 )
18 )
19 .AddText(t => t.X(20).Y(100).Fill(Color.CornflowerBlue).FontSize(48, LengthType.Pt)
20 .Filter(f => f.FilterId("shadow"))
21 .AddContent("Drop Shadow Effect")
22 )
23
24 // Call the Build() method on the SVGSVGElementBuilder to construct the <svg> element with its child elements
25 .Build(document.FirstChild as SVGSVGElement);
26 document.Save(Path.Combine(OutputDir, "text-drop-shadow-builder.svg"));
27 }
Las imágenes resultantes text-drop-shadow.svg
y text-drop-shadow-builder.svg
se ven así:
El texto tiene una sombra paralela con un color de relleno LightCoral y un radio de desenfoque de 3 unidades. La sombra se compensará 3 unidades horizontalmente y 3 unidades verticalmente desde el texto, creando un efecto de sombra paralela visualmente atractivo.
Ver también
- Más información sobre las primitivas de filtro, consulte el W3C Filter Effects Module.
- Si se pregunta cómo escribir código SVG para crear filtros SVG, desenfoque gaussiano, efectos de sombra, efectos de iluminación o degradado lineal y degradado radial, visite el artículo Filtros y degradados SVG.
- Puede descargar los ejemplos completos y los archivos de datos desde GitHub.
- Encontrará información sobre la descarga desde GitHub y la ejecución de ejemplos en la sección Cómo ejecutar los ejemplos.