SVG-Lichteffekte – SVG-Filter – C#-Code
SVG-Lichteffekte
Mit
Aspose.SVG für .NET können Sie verschiedene Lichteffekte erstellen, um die visuelle Attraktivität von Grafiken und Illustrationen zu verbessern. Lichteffekte können flachen Bildern Tiefe, Realismus und ein Gefühl von Licht verleihen. Der Lichteffekt wird in SVG mithilfe einer Reihe von Filtern erstellt. Betrachten Sie einige davon: <feSpecularLighting>
und <fePointLight>
. Sie können mehrere Filter kombinieren, Details für einen Lichteffekt erstellen und steuern.
In diesem Artikel erfahren Sie, wie Sie SVG-Code schreiben, um SVG-Lichteffekte zu erstellen, und betrachten detaillierte C#-Beispiele für die Verwendung des Aspose.Svg.Filters-Namespace, um die Lichteffekte auf SVG-Elemente oder Bitmaps anzuwenden.
Punktlichtquelle – SVG-Code
Der Filter <fePointLight>
definiert eine Lichtquelle, die einen Punktlichteffekt setzt. Es kann innerhalb des Grundelements <feDiffuseLighting>
oder <feSpecularLighting>
als untergeordnetes Element verwendet werden. Spezifische Attribute x, y
und z
geben die Position der Punktlichtquelle an. Der Filter <feSpecularLighting>
beleuchtet ein Bild mithilfe seines Alphakanals als Bump-Map. Betrachten Sie ein SVG-Beispiel für einen Lichteffekt:
1<svg xmlns="http://www.w3.org/2000/svg">
2 <rect x="40" y="40" width="150" height="150" fill="Teal" filter="url(#light)"/>
3 <defs>
4 <filter id="light">
5 <feGaussianBlur in="SourceAlpha" stdDeviation="5" result="blur"/>
6 <feSpecularLighting in="blur" result="light" specularExponent="30" lighting-color="#ddd">
7 <fePointLight x="70" y="70" z="150"/>
8 </feSpecularLighting>
9 <feComposite in="SourceGraphic" in2="light" operator="arithmetic" k1="0" k2="1" k3="1" k4="0"/>
10 </filter>
11 </defs>
12</svg>
<feGaussianBlur>
übernimmt die EingabeSourceAlpha
, also den Alphakanal des Quellbilds. Das Ergebnis wird in einem temporären Puffer namensblur
gespeichert.- Die Beleuchtung erfolgt mit den Filterprimitiven
<feSpecularLighting>
und<fePointLighting>
.<feSpecularLighting>
verwendet den Pufferblur
als Modell einer Oberflächenhöhe und generiert einen Lichteffekt aus einer Punktquelle, die im Filter<fePointLighting>
festgelegt wird. Das Ergebnis wird im Pufferlight
gespeichert. - Der
<feComposite>
-Filter nimmt zwei Eingabenin ="SourceGraphic"
undin2 ="light"
und kombiniert sie mithilfe der arithmetischen Kompositionsoperation. Die Ausgabe des arithmetischen Operators für jedes Ergebnispixel wird wie folgt berechnet: k1·in1·in2 + k2·in1 + k3·in2 + k4
In diesem Beispiel werden vier SVG-Filter angewendet, um den Lichteffekt zu erzeugen (Abbildung b):
Wenn wir den Gaußschen Unschärfefilter im Code für den “light”-Filter entfernen (Abbildung b), erhalten wir den folgenden “flat-light”-Filter, der ein flacheres Licht ergibt (Abbildung c):
1<filter id="flat-light">
2 <feSpecularLighting result="light" specularExponent="30" lighting-color="#ddd">
3 <fePointLight x="70" y="70" z="150"/>
4 </feSpecularLighting>
5 <feComposite in="SourceGraphic" in2="light" operator="arithmetic" k1="0" k2="1" k3="1" k4="0"/>
6</filter>
SVG-Lichtquelle – C#-Code
Der folgende C#-Codeausschnitt zeigt, wie Sie denselben SVG-Lichteffekt (“light”-Filter) wie im obigen SVG-Code erstellen. Betrachten wir den C#-Code Schritt für Schritt:
- Erstellen Sie eine Instanz der Klasse SVGDocument.
- Die Eigenschaft
RootElement
der SVGDocument-Klasse zeigt auf das Stammelement<svg>
des Dokuments. - Erstellen Sie ein
<defs>
-Element und fügen Sie es dem<svg>
-Element hinzu:- Verwenden Sie die Methode
CreateElementNS(
namespaceURI, qualifiedName
), um eine Instanz der Klasse SVGDefsElement zu erstellen. - Verwenden Sie die Methode
AppendChild(), um das Element
<defs>
zum Element<svg>
hinzuzufügen.
- Verwenden Sie die Methode
CreateElementNS(
- Erstellen Sie ein
<filter>
-Element, legen Sie einid
-Attribut fest und fügen Sie<filter>
zum<defs>
-Element hinzu:- Verwenden Sie die Methode CreateElementNS(), um eine Instanz der Klasse SVGFilterElement zu erstellen.
- Legen Sie eine
filterElement.Id
für das<filter>
-Element fest. Verwenden Sie die Eigenschaft Id der SVGElement-Klasse. - Verwenden Sie die AppendChild()-Methode, um den
<filter>
zum<defs>
-Element hinzuzufügen.
- Erstellen Sie ein
<feGaussianBlur>
-Element und legen Sie die Attributein
,result
undstdDeviation
fest. Fügen Sie es dann dem Element<filter>
hinzu.- Verwenden Sie die Methode CreateElementNS(), um eine Instanz der Klasse SVGFEGaussianBlurElement zu erstellen.
- Rufen Sie die Methode
SetAttribute(
name, value
) auf, um die AttributeIn1
undresult
festzulegen. - Verwenden Sie die Eigenschaften StdDeviationX und StdDeviationY der SVGFEGaussianBlurElement-Klasse, um das setDerivation-Attribut festzulegen.
- Verwenden Sie die AppendChild()-Methode, um
<feGaussianBlur>
zum<filter>
-Element hinzuzufügen.
- Erstellen Sie die Elemente
<feSpecularLighting>
,<fePointLight>
und<feComposite>
auf die gleiche Weise. Geben Sie die erforderlichen Attribute an und fügen Sie diese Elemente in der richtigen Reihenfolge zum Filter hinzu. - Erstellen Sie ein
<rect>
-Element mit Attributen und fügen Sie es dem<svg>
-Element hinzu:- Sie können die Methode CreateElementNS() verwenden, um eine Instanz der Klasse SVGRectElement zu erstellen.
- Legen Sie Attribute fest, die Position, Größe und Füllung angeben. Die Verwendung eines
filter
-Attributs, das auf den URL-Namen einesid
-Attributs infilterElement
verweist, ermöglicht die Anwendung des SVG-Lichteffekts auf das Rechteck. - Um das
rectElement
zusvgElement
hinzuzufügen, können Sie die AppendChild()-Methode verwenden.
- Rufen Sie die Methode Save() auf, um das resultierende SVG-Bild in einer durch den Pfad angegebenen lokalen Datei zu speichern.
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 = "light";
19 defsElement.AppendChild(filterElement);
20
21 // Create a <feGaussianBlur> element and add to the filterElement
22 var feGaussianBlurElement = (SVGFEGaussianBlurElement)document.CreateElementNS(SvgNamespace, "feGaussianBlur");
23 feGaussianBlurElement.StdDeviationX.BaseVal = 5;
24 feGaussianBlurElement.StdDeviationY.BaseVal = 5;
25 feGaussianBlurElement.SetAttribute("in1", "SourceAlpha");
26 feGaussianBlurElement.SetAttribute("result", "blur");
27 filterElement.AppendChild(feGaussianBlurElement);
28
29 // Create a feSpecularLighting filter primitive and add it to the filterElement
30 var feSpecularLightingElement = (SVGFESpecularLightingElement)document.CreateElementNS(SvgNamespace, "feSpecularLighting");
31 feSpecularLightingElement.In1.BaseVal = "blur";
32 feSpecularLightingElement.SetAttribute("result", "light");
33 feSpecularLightingElement.SetAttribute("specularExponent", "30");
34 feSpecularLightingElement.SetAttribute("lighting-color", "#ddd");
35 filterElement.AppendChild(feSpecularLightingElement);
36
37 // Create a fePointLight filter primitive and add it to the <feSpecularLighting> element
38 var fePointLightElement = (SVGFEPointLightElement)document.CreateElementNS(SvgNamespace, "fePointLight");
39 fePointLightElement.SetAttribute("x", "70");
40 fePointLightElement.SetAttribute("y", "70");
41 fePointLightElement.SetAttribute("z", "150");
42 feSpecularLightingElement.AppendChild(fePointLightElement);
43
44 // Create a feComposite filter primitive and add it to the filterElement
45 var feCompositeElement = (SVGFECompositeElement)document.CreateElementNS(SvgNamespace, "feComposite");
46 feCompositeElement.In1.BaseVal = "SourceGraphic";
47 feCompositeElement.In2.BaseVal = "light";
48 feCompositeElement.SetAttribute("operator", "arithmetic");
49 feCompositeElement.SetAttribute("k1", "0");
50 feCompositeElement.SetAttribute("k2", "1");
51 feCompositeElement.SetAttribute("k3", "1");
52 feCompositeElement.SetAttribute("k4", "0");
53 filterElement.AppendChild(feCompositeElement);
54
55 // Create a <rect> element and set the "fill" and "filter" attributes
56 var rectElement = (SVGRectElement)document.CreateElementNS(SvgNamespace, "rect");
57 rectElement.X.BaseVal.Value = 40;
58 rectElement.Y.BaseVal.Value = 40;
59 rectElement.Width.BaseVal.Value = 150;
60 rectElement.Height.BaseVal.Value = 150;
61 rectElement.SetAttribute("fill", "Teal");
62 rectElement.SetAttribute("filter", "url(#light)");
63 svgElement.InsertBefore(rectElement, svgElement.FirstChild);
64
65 // Save the document
66 document.Save(Path.Combine(OutputDir, "lighting-effect.svg"));
67 }
Das resultierende Bild, lighting-effect.svg, sieht genauso aus wie in Abbildung b oben.
Siehe auch
- Sie können die vollständigen Beispiele und Datendateien von GitHub herunterladen.
- Informationen zum Herunterladen von GitHub und zum Ausführen von Beispielen finden Sie im Abschnitt So führen Sie die Beispiele aus.
- Weitere Informationen zu Filterprimitiven finden Sie auf der Seite W3C Filter Effects Module und im Artikel SVG-Filter und -Verläufe.