Bildoben  
aptico-Home | AGB-(c) | SVG-Tutorial Inhalt
Schatten

SVG Tutorial

  svg tutorial index  |  Kapitel 14   

14.6 feConvolveMatrix

Der primitive Filter feConvolveMatrix bewirkt eine Veränderung der Bildpunkt-Matrix. Dabei werden Bildpunkte des Input-Bildes mit benachbarten Bildpunkten vermischt. Dadurch eignet sich dieser Filter für eine große Anzahl von Effekten, wie: verwischen, Kanten scharfzeichen, scharfzeichnen oder Prägeeffekte.

Mit Hilfe des Attributs order müssen Sie festlegen, welche und wieviele benachbarte Bildpunkte in die Berechnung einbezogen werden. Zu diesem Zweck definieren Sie eine sogenannte Kernel-Matrix, die aus einer festgelegten Anzahl von Punkten besteht, welche in Spalten und Zeilen geordnet sind.
Das Attribut order aktzeptiert 2 durch Komma getrennte Ganzzahlen als Wert. Dabei bestimmt die erste Ganzahl die Anzahl der Spalten der Kernel-Matrix und die zweite Ganzahl die Anzahl der Zeilen der Kernel-Matrix. Wenn Sie nur eine Ganzahl als Wert für order verwenden, gibt diese sowohl die Anzahl der Spalten als auch die Anzahl der Zeilen der Kernel-Matrix an.
Der voreingestellte Wert für order ist 3, d.h. eine Kernel-Matrix, deren insgesamt 9 Bildpunkte in 3 Zeilen a 3 Reihen angeordnet sind.
Die so festgelegte Kernel-Matrix wird mittig auf jeden Bildpunkt der Bild-Matrix gelegt. Auf diese Art sind alle benachbarten Bildpunkte, für jeden neu zu berechnenden Bildpunkt eindeutig bestimmt.

Mit dem Attribut kernelMatrix müssen Sie für jeden einzelnen Bildpunkt der Kernel-Matrix einen Zahlwert bestimmen, der bei der Neuberechnung als Faktor verwendet wird.
Dem Attribut kernelMatrix muß als Wert also eine, durch Leerzeichen und/oder Komma getrennte Liste aus Zahlen zugeordnet werden. Dabei muß die Anzahl der Zahlen mit der Anzahl der Bildpunkte der Kernel-Matrix übereinstimmen.

Beispiel Quellcode


   Grafische Darstellung:   SVG-Darstellung (nur SVG-fähige Browser!)    Screenshot JPG-Grafik
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg width="380px" height="370px"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <title>Der primitive Filter feConvolveMatrix</title>
  <desc>
    Beispiele für die Verwendung von feConvolveMatrix
  </desc>
  <defs>
    <style type="text/css">
    <![CDATA[
      text {font-family:Verdana,sans-serif; font-size:16px;
            font-weight:bold;}
    ]]>
    </style>
    <symbol id="smilie">
      <desc>ein lachendes Smilie</desc>
      <circle id="gesicht" cx="20" cy="20" r="15"
        fill="yellow" stroke="black" />
      <circle id="auge-links" cx="15" cy="15" r="2"
        fill="black" stroke="black" />
      <circle id="auge-rechts" cx="25" cy="15" r="2"
        fill="black" stroke="black" />
      <line id="nase" x1="20" y1="18" x2="20" y2="23"
        stroke="black" stroke-width="2" />
      <path id="mund" d="M 13 26 A 5 3 0 0 0 27 26"
        stroke="black" fill="none" stroke-width="2" />
    </symbol>

<!-- 6 Filter mit feConvolveMatrix -->
    <filter id="f1">
      <feConvolveMatrix order="3"
        kernelMatrix="1 1 1 1 1 1 1 1 1" />
    </filter>
    <filter id="f2">
      <feConvolveMatrix order="3"
        kernelMatrix="1 0 0 0 0 0 0 0 1" />
    </filter>
    <filter id="f3">
      <feConvolveMatrix order="10,1"
        kernelMatrix="1 1 1 1 1 1 1 1 1 1" />
    </filter>
    <filter id="f4">
      <feConvolveMatrix order="1,10"
        kernelMatrix="1 1 1 1 1 1 1 1 1 1" />
    </filter>
<!-- zusätzlich mit feBlend -->
    <filter id="f5">
      <feConvolveMatrix order="10,1"
        kernelMatrix="1 1 1 1 1 1 1 1 1 1" result="out1" />
      <feBlend in="SourceGraphic" in2="out1" mode="multiply" />
    </filter>
    <filter id="f6">
      <feConvolveMatrix order="10,1"
        kernelMatrix="0 0 0 0 0 1 1 1 1 1" result="out1" />
      <feBlend in="SourceGraphic" in2="out1" mode="multiply" />
    </filter>
  </defs>

<!-- die Instanzen des Symbols "smilie" -->
  <use xlink:href="#smilie" transform="translate(20,10) scale(2.7)" />
  <use xlink:href="#smilie" transform="translate(150,10) scale(2.7)"
    filter="url(#f1)" />
  <use xlink:href="#smilie" transform="translate(250,10) scale(2.7)"
    filter="url(#f2)" />
  <use xlink:href="#smilie" transform="translate(150,130) scale(2.7)"
    filter="url(#f3)" />
  <use xlink:href="#smilie" transform="translate(250,130) scale(2.7)"
    filter="url(#f4)" />
  <use xlink:href="#smilie" transform="translate(150,250) scale(2.7)"
    filter="url(#f5)" />
  <use xlink:href="#smilie" transform="translate(250,250) scale(2.7)"
    filter="url(#f6)" />

<!-- Text und Hilfslinien -->
  <text x="145" y="130">feConvolveMatrix</text>
  <text x="58" y="130">Original</text>
  <line x1="137" y1="40" x2="137" y2="330" stroke="black" />
</svg>
      

Die Filter f1 und f2 im obigen Beispiel, verwenden den Standardwert 3 für das Attribut order. Daher sind jeweils genau 9 Werte für das Attribut kernelMatrix angegeben.
Die Kernel-Matrix die im Filter f3 festgelegt wird besteht nur aus einer Zeile mit 10 Spalten, die Kernel-Matrix im Filter f4 aus 10 Zeilen mit nur einer Spalte. In beiden Fällen sind hierdurch genau 10 Punkte definiert. Daher sind jeweils genau 10 Werte für das Attribut kernelMatrix angegeben.
Bei den Filtern f5 und f6 wird zusätzlich feBlend verwendet, um das Quellbild (Orginalbild) mit dem Output von feConvolveMatrix zu verschmelzen.

Für den primitiven Filter feConvolveMatrix stehen noch weitere Attribute zur Verfügung. Mit Hilfe der Attribute targetX und targetY können Sie einen beliebigen Punkt der Kernel-Matrix bestimmen, der auf den orginalen Bildpunkt gelegt wird. Im Normalfall ist das der Mittelpunkt der Kernel-Matrix.
targetX akzeptiert einen Spaltenwert und targetY einen Zeilenwert, wobei beide Werte natürlich innerhalb der durch order angegeben Spalten- und Zeilenwerte der Kernel-Matrix liegen müssen.

Durch das Attribut divisor können Sie einen bei der Berechnung des Outputs verwendeten Divisior (Teiler) verändern. Wenn Sie dieses Attribut nicht verwenden, wird die Summe aller Bildpunkte der Kernel-Matrix als Divisor verwendet.

An den Rändern des Bildes kann es vorkommen, dass die Kernel-Matrix teilweise über das Bild lappt, so das einzelne Punkte der Kernel-Matrix nicht mehr auf Bildpunkten zu liegen kommen. Um festlegen zu können, wie solche Fälle gehandhabt werden, verwenden Sie das Attribut edgeMode.
edgeMode akzeptiert drei Werte: duplicate, wrap und none. Voreingestellter Wert ist duplicate, wodurch den Werten, die im Leerraum liegen, die äußersten Werte am entsprechenden Rand zugewiesen werden. Bei Verwendung von wrap werden die aüßersten Werte des gegenüberliegenden Randes verwendet. Bei none wird den Werten 0 zugewiesen.

Falls Sie nicht möchten, dass auch die Alphawerte des Bildes neu berechnet werden, steht Ihnen zu diesem Zweck das Attribut preserveAlpha zur Verfügung. Dieses Attribut akzeptiert 2 mögliche Werte: den voreingestellten Wert false (die Alphawerte des Bildes werden neu berechnet) und der Wert true (die Alphawerte des Bildes werden nicht neu berechnet).




index  |  Kapitel 14  |  14.5  <<  | 14.6 |  >>  14.7   feDisplacementMap