Introduzione ai Filtri SVG
I filtri SVG aggiungono effetti alla grafica. Scopri le primitive di filtro, la regione del filtro, il concatenamento e gli elementi della specifica SVG Filter.
Attualmente, CSS offre un modo per applicare effetti cromatici alle immagini (ad es. luminosità, saturazione, contrasto, ecc.) tramite la proprietà filter. Tuttavia, i filtri CSS sono limitati: forniscono un insieme fisso di funzioni monouso (blur(), brightness(), drop-shadow(), ecc.) che si applicano a un intero elemento, principalmente per la manipolazione del colore e la sfocatura. Per creare effetti più potenti e compositi, occorrono altre funzioni. Tali funzioni sono disponibili in SVG.
Questa pagina introduce cosa fanno i filtri SVG, l'elemento <filter> e la sua regione, e come le primitive di filtro vengono concatenate tramite il meccanismo in/result.
Cosa Fanno i Filtri SVG (e Quando Usarli)
Un filtro SVG è una piccola pipeline di elaborazione delle immagini. Invece di un singolo effetto prefabbricato, si descrive una catena di operazioni a basso livello — chiamate primitive di filtro — in cui l'output di un passaggio diventa l'input del successivo. Concatenando le primitive, è possibile costruire effetti che CSS da solo non può esprimere:
- Ombre e bagliori ottenuti sfasando, sfocando, ricolorando e ricomponendo la grafica originale.
- Texture e rumore generati con
<feTurbulence>(rumore di Perlin) per nuvole, carta, marmo, ecc. - Spostamento / deformazione con
<feDisplacementMap>, che sposta i pixel usando un'altra immagine come mappa di altezza. - Effetti di illuminazione che trattano il canale alfa come una mappa bump 3D.
Quando scegliere i filtri SVG rispetto ai filtri CSS: usa la proprietà CSS filter quando hai bisogno di un effetto rapido e singolo (una sfocatura, una regolazione della luminosità, un'ombra) su qualsiasi elemento HTML o SVG. Usa i filtri SVG quando devi combinare più operazioni in un unico effetto composito, generare texture o applicare spostamenti — in qualsiasi caso in cui sia necessario passare l'output di un'operazione come input di un'altra.
L'Elemento <filter> e la Sua Regione
Si definisce un filtro una sola volta all'interno di <defs> e lo si referenzia da una forma tramite l'attributo filter="url(#id)" (oppure la proprietà CSS filter). L'elemento <filter> di per sé non disegna nulla — è un contenitore per le primitive che svolgono il lavoro.
Un filtro ha una regione del filtro: un riquadro di delimitazione che limita dove viene visualizzato il risultato filtrato. Tutto ciò che viene disegnato al di fuori di questa regione viene ritagliato. La regione è controllata da questi attributi su <filter>:
| Attributo | Scopo |
|---|---|
x, y, width, height | Posizione e dimensione della regione del filtro. Predefinito: x="-10%", y="-10%", width="120%", height="120%" — ovvero un padding del 10% su ciascun lato del riquadro di delimitazione della sorgente. |
filterUnits | Sistema di coordinate per x/y/width/height. Predefinito objectBoundingBox (i valori sono frazioni/percentuali del riquadro di delimitazione della sorgente); userSpaceOnUse usa coordinate assolute nello spazio utente. |
primitiveUnits | Sistema di coordinate per i valori di lunghezza all'interno delle primitive (ad es. dx/dy di feOffset). Predefinito userSpaceOnUse. |
Questa regione è la causa più comune di problemi. Effetti come sfocature e ombre si estendono al di fuori della forma originale, e la regione predefinita del 120% è spesso troppo piccola — l'ombra viene ritagliata ai bordi. Se l'effetto appare troncato, ingrandisci la regione, ad esempio x="-50%" y="-50%" width="200%" height="200%".
Primitive di Filtro
In SVG, ogni elemento <filter> include un insieme di elementi filtro come figli. Ogni primitiva di filtro esegue un'operazione grafica di base su uno o più input, ma produce un solo risultato. L'input è specificato in un attributo chiamato in. Il risultato dell'operazione è specificato nell'attributo result. Il risultato può poi essere usato come input per altre operazioni. Tuttavia, se l'attributo in è omesso, la primitiva utilizza per impostazione predefinita SourceGraphic per la prima operazione, oppure il risultato della primitiva precedente per le operazioni concatenate. Tutte le primitive hanno lo stesso prefisso: fe (abbreviazione di "filter effect"). Il loro nome dipende da cosa un elemento è o fa. Ad esempio, la primitiva che applica un effetto di sfocatura gaussiana alla grafica sorgente si chiama feGaussianBlur.
Parole Chiave di Input Speciali
Oltre a indicare il result di una primitiva precedente, l'attributo in può fare riferimento a questi input predefiniti:
| Parola chiave | Significato |
|---|---|
SourceGraphic | L'elemento originale a cui il filtro è applicato, a colori completi. |
SourceAlpha | Lo stesso elemento, ma solo il suo canale alfa (trasparenza) — utile come sagoma per le ombre. |
BackgroundImage | Uno snapshot del canvas sotto l'elemento. |
BackgroundAlpha | Il canale alfa di BackgroundImage. |
FillPaint | Il colore di fill dell'elemento, espanso a riempire la regione del filtro. |
StrokePaint | Il colore di stroke dell'elemento, espanso a riempire la regione del filtro. |
Nota:
BackgroundImage,BackgroundAlpha,FillPainteStrokePaintfanno parte della specifica ma hanno scarso o nessun supporto nei browser odierni; in pratica si lavora conSourceGraphic,SourceAlphae ilresultdi altre primitive.
Attualmente sono definite 17 primitive di filtro nella specifica SVG Filter.
Elementi Filtro in SVG
| Elemento | Descrizione |
|---|---|
<feBlend> | Fonde due oggetti insieme usando le modalità di fusione tipiche dei software di grafica. |
<feColorMatrix> | Applica una trasformazione matriciale. |
<feComponentTransfer> | Esegue il rimappaggio componente per componente dei dati. |
<feComposite> | Esegue la combinazione pixel per pixel di due immagini di input nello spazio immagine. |
<feConvolveMatrix> | Applica un effetto filtro di convoluzione matriciale. |
<feDiffuseLighting> | Illumina un'immagine usando il canale alfa come mappa bump. |
<feDisplacementMap> | Usa i valori dei pixel dell'input in2 per spostare l'immagine di input in. |
<feFlood> | Crea un rettangolo riempito con i valori di opacità e colore delle proprietà flood-opacity e flood-color. |
<feGaussianBlur> | Applica una sfocatura gaussiana all'immagine di input. |
<feImage> | Fa riferimento a una grafica esterna a questo elemento, che viene caricata o renderizzata in un raster RGBA diventando il risultato della primitiva. |
<feMerge> | Fonde livelli di immagini di input. |
<feMorphology> | Esegue operazioni di "assottigliamento" o "ingrossamento". |
<feOffset> | Sposta l'immagine di input. |
<feSpecularLighting> | Illumina una grafica sorgente usando il canale alfa come mappa bump. |
<feTile> | Riempie un rettangolo di destinazione con un pattern ripetuto di un'immagine di input. |
<feTurbulence> | Crea un'immagine con la funzione di turbolenza di Perlin. |
<feDropShadow> | Crea un effetto ombra esterna. |
Un Esempio con Una Sola Primitiva
Il filtro più semplice ha una sola primitiva. Qui feGaussianBlur prende il SourceGraphic e lo sfoca:
<svg width="200" height="200">
<defs>
<filter id="blur">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" />
</filter>
</defs>
<rect x="10" y="10" width="180" height="180" fill="blue" filter="url(#blur)" />
</svg>Concatenamento di Primitive: un'Ombra Esterna
La vera potenza deriva dal concatenamento. Per costruire manualmente un'ombra esterna, si prende la sagoma dell'elemento, la si sposta verso il basso e verso destra, la si sfoca, quindi si posiziona la grafica originale di nuovo sopra. Segui gli attributi result/in per vedere come l'output di ogni passaggio scorre nel successivo:
<svg width="220" height="220">
<defs>
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<!-- 1. Take the alpha (silhouette) of the source -->
<feOffset in="SourceAlpha" dx="6" dy="6" result="offset" />
<!-- 2. Blur that offset silhouette -->
<feGaussianBlur in="offset" stdDeviation="4" result="blur" />
<!-- 3. Stack the blurred shadow under the original graphic -->
<feMerge>
<feMergeNode in="blur" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<rect x="20" y="20" width="160" height="160" rx="12"
fill="#1e88e5" filter="url(#shadow)" />
</svg>Come scorrono i dati:
feOffsetleggeSourceAlpha(la sagoma della forma) e la sposta didx/dy, scrivendoresult="offset".feGaussianBlurleggein="offset"e la ammorbidisce, scrivendoresult="blur".feMergesovrappone i livelli dal basso verso l'alto: prima ilblur(l'ombra), poi ilSourceGraphicnon sfocato sopra — così la forma nitida si posiziona sulla sua ombra morbida.
Nota la regione del filtro ingrandita (width="140%" height="140%") affinché l'ombra sfocata e spostata non venga ritagliata.
Per scorciatoie già pronte, consulta la primitiva <feDropShadow> e il capitolo sugli effetti di sfocatura SVG. Un elenco completo degli attributi per ogni primitiva si trova nel riferimento SVG.