Signatur
Beschreibung
SVGComponentTransferFunctionElement ist ein abstraktes Basis-Interface. Es wird nie direkt instanziiert, sondern von den vier Elementen SVGFEFuncRElement, SVGFEFuncGElement, SVGFEFuncBElement und SVGFEFuncAElement geerbt. Diese Elemente stehen als Kinder eines <feComponentTransfer>-Filters und legen fest, wie jeder einzelne Farbkanal (Rot, Grün, Blau, Alpha) eines Bildes umgerechnet wird – etwa für Helligkeit, Kontrast, Gammakorrektur, Posterisierung oder Invertierung.
Das Interface stellt die Attribute der Übertragungsfunktion als animierbare Eigenschaften bereit:
type(SVGAnimatedEnumeration) – Art der Funktion:identity,table,discrete,linearodergamma.tableValues(SVGAnimatedNumberList) – Stützwerte fürtableunddiscrete.slope,intercept(SVGAnimatedNumber) – Steigung und Achsenabschnitt fürlinear(C' = slope · C + intercept).amplitude,exponent,offset(SVGAnimatedNumber) – Parameter fürgamma(C' = amplitude · Cexponent + offset).
Zusätzlich definiert es die Konstanten SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN (0), _IDENTITY (1), _TABLE (2), _DISCRETE (3), _LINEAR (4) und _GAMMA (5), mit denen type.baseVal gelesen und gesetzt wird. Jede Eigenschaft besitzt einen baseVal (Wert des Attributs, änderbar) und einen animVal (aktueller, ggf. durch SMIL animierter Wert, nur lesbar).
Einsatzgebiet: Wenn Sie Farbfilter per JavaScript dynamisch steuern möchten – z. B. einen Helligkeitsregler, der live den slope eines Filters verändert – greifen Sie über dieses Interface typisiert auf die Werte zu, statt Attribut-Strings zu parsen.
Rückgabewert
document.createElementNS('http://www.w3.org/2000/svg', 'feFuncR') (bzw. feFuncG, feFuncB, feFuncA) oder durch Auslesen vorhandener Elemente aus dem DOM.Beispiele
Filter mit linearer Übertragungsfunktion per JavaScript erzeugen
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(SVG_NS, 'svg');
const filter = document.createElementNS(SVG_NS, 'filter');
filter.id = 'helligkeit';
const transfer = document.createElementNS(SVG_NS, 'feComponentTransfer');
// Gleiche lineare Funktion für R, G und B
for (const kanal of ['feFuncR', 'feFuncG', 'feFuncB']) {
const func = document.createElementNS(SVG_NS, kanal);
func.setAttribute('type', 'linear');
func.setAttribute('slope', '1.5');
func.setAttribute('intercept', '0');
transfer.append(func);
}
filter.append(transfer);
svg.append(filter);
document.body.append(svg);
const r = transfer.firstElementChild;
console.log(r instanceof SVGComponentTransferFunctionElement);
console.log(r.type.baseVal === SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR);
console.log(r.slope.baseVal);
Helligkeitsregler: slope live ändern
// HTML: <input type="range" id="regler" min="0" max="3" step="0.1" value="1">
// und ein <svg> mit <filter id="helligkeit"> wie oben
const funktionen = document.querySelectorAll('#helligkeit feFuncR, #helligkeit feFuncG, #helligkeit feFuncB');
document.querySelector('#regler').addEventListener('input', (event) => {
const wert = Number(event.target.value);
for (const func of funktionen) {
// Typisierter Zugriff statt setAttribute
func.slope.baseVal = wert;
}
});
// Filter auf ein Bild anwenden
document.querySelector('img').style.filter = 'url(#helligkeit)';
Funktionstyp umstellen und Tabellenwerte auslesen
const SVG_NS = 'http://www.w3.org/2000/svg';
const func = document.createElementNS(SVG_NS, 'feFuncR');
// Invertierung über eine Tabelle
func.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE;
func.setAttribute('tableValues', '1 0');
console.log(func.getAttribute('type'));
const liste = func.tableValues.baseVal;
const werte = Array.from({ length: liste.numberOfItems }, (_, i) => liste.getItem(i).value);
console.log(werte);
// Standardwerte der Gamma-Parameter
console.log(func.amplitude.baseVal, func.exponent.baseVal, func.offset.baseVal);
// Wichtig · Fallstricke
- Kein Konstruktor:
new SVGComponentTransferFunctionElement()wirft einenTypeError. SVG-Elemente immer mitcreateElementNSund dem SVG-Namensraum erzeugen.document.createElement('feFuncR')liefert nur ein wirkungslosesHTMLUnknownElement. - Farbraum: Filter rechnen standardmäßig im Farbraum
linearRGB. Wer Werte erwartet, die zu sRGB-Farbwerten passen, solltecolor-interpolation-filters="sRGB"auf dem Filter oder dem Primitive setzen. - Nur passende Attribute wirken:
slope/interceptgelten nur beilinear,amplitude/exponent/offsetnur beigammaundtableValuesnur beitable/discrete. Fehlt ein Kanal-Element, bleibt dieser Kanal unverändert (identity). - baseVal vs. animVal: Schreiben Sie immer in
baseVal.animValist nur lesbar und gibt bei SMIL-Animation den aktuellen Wert wieder. - Werden mehrere gleichartige Kinder angegeben (z. B. zwei
<feFuncR>), gilt nur das letzte. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Aufwendige Filter auf großen Flächen können beim Rendern Leistung kosten; für einfache Effekte sind CSS-Filter wie
brightness()oft günstiger.