SVG und CSS-Filter für Bitmaps / Fotos

SVG Filter und Effekte: Blur und Motion Blur, Schwarzweiß, Negativ, Saturation, Grayscale Blur oder Weichzeichnen mit GaussianBlur, Noice (Rauschen) mit Turbulence und ColorMatrix

SVG-Filter konstruieren Effekte – vom Weichzeichner wie Gaussian Blur über Rauschen (Noice) bis hin zu Schlagschatten und Farbverschiebungen. Sie verwandelt glatte Oberflächen in löchrigen Käse, rostiges Metall und erzeugen synthetische Texturen wie Marmor, Holz und Wolken.

Auch wenn es inzwischen die leichteren Optionen für Filtereffekte direkt mit CSS filter gibt – da fehlt noch der Support in IE11. Eine Übersetzung der CSS-Filter in SVG-Filter ist aber einfach.

Die Tags für Filter beginnen mit fe für Filter Effect. Sie stecken in einem filter-Element, werden vorzugsweise in einem defs-Element (Definition) angelegt und über ihre ID auf Elemente, Texte oder Gruppen angewendet.

Natürlich sind Filter unter einer grafischen Benutzeroberfläche wie Inkscape oder Adobe Illustrator einfacher und verständlicher in ihrem Zusammenspiel. Filter in Handarbeit sind die Grundlage für Animationen.

Es gibt rund zwei Dutzend Filter, und ihre Anwendung als Filter-Primitive ist denkbar einfach. Die interessantesten Effekte entstehen aus dem Zusammenwirken von mehreren Filtern, die auf ein Element wie path, rect, circle oder text, ganze Gruppen von Elementen oder einen anderen Filter angewendet werden (verketten von Filtern, chaining). Filter funktionieren auf einzelnen Elementen oder auf Gruppen, Mustern (pattern) und Masken und können am Ende auch noch animiert werden.

feGaussianBlur
Weichzeichnen und Bewegungsunschärfe (Motion Blur)
feMorphology
Form erweitern (dilate) oder verdünnen (erode).
feOffset
Schlagschatten
feTurbulence
künstliche Texturen vom Rauschen bis zu Wolken, Holz und Marmor

feGaussianBlur – SVG Gausscher Weichzeichner

In seiner einfachsten Form braucht der feGaussianBlur-Filter nur eine Abweichung durch das stdDeviation-Attribut – den Grad der Weichzeichnung.

<filter id="blur">
   <feGaussianBlur stdDeviation="5" />
</filter>
<path filter="url(#blur)" d="m 352,43 c -3,0 -6,2  …" />

oder

<path style="filter:url(#blur)" d="m 352,43 c -3,0 -6,2  …" />

Wie gesagt: Das war die einfachste Anwendung. stdDeviation kann mit zwei Argumenten aufgerufen werden: x- und y-Richtung. Mit beiden Werte wird die einfache Weichzeichnung zur Bewegungsunschärfe (motion blur).

feOffset – Drop Shadow oder Schlagschatten

dx und dy versetzen ein Element in x- und y-Richtung. Setzt man noch feGaussianBlur in den Filter, entsteht ein Schlagschatten. SVG Effekte bilden dann Ketten

<filter id="drop" >
   <feOffset dx="10" dy="10" />
   <feGaussianBlur stdDeviation="5" />
</filter>

Filter Chain – Filter verketten

Die einfachste Variante des Blur-Filters hat einen Haken – der Schatten hat die Farbe des Elements. Von einem Schatten erwarten wir allerdings ein mehr oder minder helles Grau.

<filter id="drop-shadow">
   <!-- Nimm die Grafik mit dem in-Attribut, 
        setze den Blur-Filter darauf an
        und nenne das Ergebnis "shadow". -->
   <feGaussianBlur in="SourceGraphic" stdDeviation="10" result="shadow" />

   <!-- Verschiebe die Ausgabe des vorherigen Filters
        um 12 Pixel nach rechts und um 8 Pixel nach unten
        und reiche das Ergebnis unter demselben Namen weiter. -->
   <feOffset in="shadow" dx="12" dy="8" result="shadow" />

   <!-- Wandle das Ergebnis in Graustufen  
        und helle es auf -->
   <feColorMatrix in="shadow" mode="matrix" values="0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 0.6 0" result="shadow" />

   <!-- Setze das Original über den Schatten -->
   <feBlend in="SourceGraphic" in2="shadow" />
</filter>

SVG Motion Blur – Bewegungsunschärfe

Bewegungsunschärfe ist auch nur Unschärfe, also blur … das Attribut stdDeviation hat einen zweiten optionalen Parameter, der den Effekt einer Bewegungsunschärfe erzeugt.

<filter id="motionblur" color-interpolation-filters="sRGB">
	<feGaussianBlur stdDeviation="15,0" />
</filter>

Der erste Wert erzeugt die Abweichung in x- und der zweite optionale Filter in y-Richtung.

color-interpolation-filters bestimmt den Farbraum des SVG-Filters. Per Vorgabe ist der Farbraum linearRGB; damit der Effekt nicht so schwach ausfällt, ist color-interpolation-filters hier auf den sRGB-Farbraum gesetzt.

feTurbulence – Rauschen, zerkratzen, Woken und Marmor

feTurbulence erzeugt Rauschen (farbige Pixel wie bei digitalen Fotos mit hohem ISO-Wert) ist von Haus aus komplexer – und rechenintensiver im Client. Ohne weitere Zutaten füllt feTurbulence nicht die Form, sondern das vollständige umfassende Rechteck um das Element. Erst ein clipPath schneidet die Form aus dem Block.

<defs>
   <filter id="noise" >
      <feTurbulence baseFrequency="0.5" />
   </filter>
		
   <clipPath id="outline">
      <path d="m 352,43 c -3,0 …" />
   </clipPath>
</defs>
<rect … filter="url(#noise)" clip-path="url(#outline)"/>

Das baseFrequency-Attribut kann genauso wie stdDeviation mit zwei Argumenten (für die x/y-Richtung) aufgerufen werden.

baseFrequency | num[,num]
Ein einzelner Wert gibt die Rauschfrequenz in x und y-Richtung an.
numOctaves | num
Je höher der Wert, desto detaillierter und feiner werden die Turbulenzen. Vorgabe ist 1, bei 0 entsteht kein Rauschen.
seed | num
Zufallsgenerator. 0 ist die Vorgabe und Wiederholungen werden schnell als Muster sichtbar.
stitchTiles | stitch | noStitch
stich setzt weiche Übergänge zwischen den Kacheln des Musters (Kacheln entstehen durch die Wiederholung des Musters). noStitch ist die Vorgabe.
type | fractalNoise | turbulence
Variationen des feTurbulence-Filters. turbulence ist die Vorgabe.

feMorphology

Der SVG-Morph-Filter verdünnt (erode) eine Form oder weitet sie aus (dilate) und liefert Text-Effekte wie emboss (eingravieren) und Neonschein. Das Attribut radius bestimmt die Ausdehnung der Erosion bzw. Verdickung.

<filter id="morphp" >
   <feMorphology operator="dilate" radius="9" />
</filter>

<text fill="lightslategray" stroke="darkslategray" stroke-width="2" filter="url(#morphp)">WEST</text>
<text fill="darkslategray" stroke="green" stroke-width="2">WEST</text>
Morph-Effekt bei Formen
Morph-Effekt bei Texten WEST WEST
SVG Filter