Accueil

Traduction

Dessiner avec SVG - sommaire

Dessiner avec SVG - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

SVG : les filtres

Les floutages et ombrages qui donnent un côté plus realiste aux dessins vectoriels sont produits grâce à des filtres.
Mais grâce aux filtres SVG on peut appliquer aux images insérées d'autres effets qui sont bien connus des utilisateurs de Photoshop : filtres de couleur, dilatation, contraction, luminosité, contraste, etc.
Un filtre SVG est défini (dans la partie DEFS) grâce à la balise filter.
On applique un filtre à un objet SVG via l'attribut filter

Les filtres simples

Je vais d'abord vous présenter des filtres simples c'est à dire ceux basés sur une seule "primitive".

Floutage

Le code correspondant

Vous constatez que les rectangles ainsi que la photo sont floutés. On parle de flou gaussien.

J'ai défini un flou gaussien avec le conteneur filter incluant la balise feGaussianBlur.
On dit que feGaussianBlur est une primitive.
Ce filtre est identifié "flou". Pour diminuer le floutage il suffirait de réduire la valeur de l'attribut stdDeviation.

La primitive feOffset

Un rectangle et son ombre Une ellipse et son ombre

Le code SVG correspondant

La primitive feOffset décale tout simplement la forme selon les valeurs des attributs dx et dy par rapport à sa position définies par les paramètres géométriques.

Observez bien le code SVG. Les deux rectangles ont exactement les mêmes coordonnées pour l'arête supérieure gauche et les mêmes dimensions et pourtant le rectangle rempli de gris est décalé de 20 pixels en bas et à droite car il lui a été affecté le filtre identifié "decale".
Les deux ellipses ont aussi les mêmes coordonnées mais l'ellipse grise est aussi décalée de 20px par rapport à la verte.

Donc j'ai créé un effet d'ombre. Vous allez rétorquer à juste titre qu'une ombre c'est non seulement la même forme remplie de gris et décalée par rapport à la forme principale en premier plan mais que la forme grise doit être aussi légèrement floutée.

Pour produire une ombre portée il faudrait donc jouer sur deux primitives : feOffset et feGaussianBlur. Il faudrait donc créer un filtre composite appliquée à la forme grise.
Voir la solution en fin de chapitre.

La primitive feMorphology

Le code SVG correspondant

Les images font penser à des tableaux du courant "impressionniste"
Les deux images de gauche subissent une "dilatation" et celles de droite une "contraction" !

La primitive feMorphology permet de modifier la morphologie de l’image d'une image.
Deux opérations sont possibles : la dilatation et la contraction. L'attribut operator peut prendre en effet deux valeurs erode ou dilate.
Le niveau de contraction ou de dilatation est réglé grâce à l’attribut radius.

Les filtres de couleur

La primitive matrice de couleur permet de recalculer la valeur de chaque pixel de l’image (comme pour la matrice de convolution)
La nouvelle valeur du pixel est calculée par rapport aux quatre composantes: rouge, vert, bleu, canal alpha (transparence).
La primitive feColorMatrix a deux attributs type et values.
L'attribut type peut prendre les valeurs matrix, saturate, hueRotate, luminanceToAlpha.

Valeur de l'attribut type est hueRotate

Commençons par le type hueRotate car c'est le plus simple.

Le code SVG correspondant

On définit différents filtres SVG de type hueRotate.
Notez que les valeurs de l'attribut values sont comprises entre 0 et 360 (degrés).
Il s’agit d’une rotation sur le cercle chromatique. Attention une rotation de 360° équivaut à une rotation de 0°.
Une rotation de 90 verdit l'image, une rotation de 180 bleuit la photo et une rotation de 270 rougit l'image.
Une rotation de 360 équivaut à une rotation de 0 et donc n'a indicidence sur l'image.

On applique ces différents filtres à chacune des insertions de la même image matricielle.

Valeur de l'attribut type est saturate

Un filtre de couleur avec l'attribut type valant saturate est aussi très simple.

Le code SVG correspondant

On définit différents filtres de type saturate.

La saturation permet d’abaisser ou augmenter l’intensité des couleurs d’une image.
Si l'attribut type vaut saturate alors l'attribut values prend comme valeur un entier positif.
Si la valeur est 0 alors l'image est en nuances de gris et si la valeur est 1 alors l'image filtrée est identique à l'original. Si la valeur est supérieure à 1 il y a saturation.

On applique ces différents filtres aux différentes insertions dans le canevas SVG de la même photo.

Valeur de l'attribut type est Matrix

On arrive à des choses un peu plus compliquées car il faut créer une matrice 4 * 5 !

Le code correspondant

Trois filtres définis :

Les filtres de convolution

Les filtres de convolution permettent d’appliquer sur des images divers effets très utiles comme le floutage, l’embossage, la détection des contours ou le rehaussement des détails.

Un peu de théorie

Une convolution est un traitement d'une matrice par une autre appelée matrice de convolution ou « noyau » (kernel).

Le filtre étudie successivement chacun des pixels de l'image. Pour chaque pixel appelé « pixel initial », il multiplie la valeur de ce pixel et de chacun des 8 pixels qui l'entourent par la valeur correspondante dans le noyau. Il additionne l'ensemble des résultats et le pixel initial prend alors la valeur du résultat final.

Le noyau (valeur de l'attribut kernelMatrix est une matrice de 3 par 3.

Le code SVG correspondant

On définit cinq filtres dans le conteneur defs

Attention notez que pour ce dernier filtre, outre l'attribut kernelMatrix il y a l'attribut preserveAlpha avec la valeur true. Cela indique que le filtre de convolution ne s'applique pas à la couche Alpha (opacité)

On insère dans le canevas cinq fois la même image matricielle et pour chaque insertion on applique un des filtres.

Les filtres composites en SVG

On peut cumuler plusieurs filtres.

Ombre portée

Il faut combiner les primitives feGaussianBlur & feOffset et appliquer ce filtre à une forme remplie de gris ayant les mêmes type, dimension et position que la forme principale. un rectangle avec ombre portée une ellipse avec ombre portée

Le code SVG correspondant

Le filtre identifié ombrage est basé sur deux primitives :

Notez l'emploi de l'attribut result pour le première primitive et de l'attribut in pour la deuxième primitive.
Cela veut dire que l'on chaîne les filtres ; la primitive FeOffset s'applique au flou produit par la première primitive et identifié "flou".

Ce filtre composite est appliqué à la forme grise qui est dessinée avant la forme rouge. Le couple de formes doit avoir le même type, même dimension et position.

Comment générer la définition des filtres

Vous avez pu constaté dans ce chapitre que la définition des filtres peut être assez lourde ...

Si vous utilisez le framework JS pour SVG intitulé Snap SVG la définition devient très simple, aussi simple qu'en CSS 3.
Le problème est que ces définitions ne sont disponibles que dans le cadre du script ...
Les filtres avec Snap SVG

Si vous utilisez des éditeurs WYSIWYG de SVG tels Inkscape ou Boxy SVG, vous pouvez définir les filtres via ces interfaces graphiques.
Chaque filtre défini sera identifié via un ID.
Inkscape et les filtres
Boxy SVG et les filtres

Appliquer des filtres CSS à des objets SVG ?

Les navigateurs autorisent désormais l'application de filtres CSS à des éléments SVG.
Or la définition des filtres en CSS est beaucoup plus simple qu'en SVG.
Il s'agit donc d'une remarquable avancée en matière de programmation web.

Exemple

Ci-dessous trois éléments HTML et trois éléments SVG auxquels j'ai appliqué les mêmes filtres CSS.

Les éléments HTML : 3 balises IMG


Les éléments SVG : 3 balises RECT

La première image et le premier rectangle sont floutés.
La deuxième image et le deuxième rectangle sont ombrés.
La troisième image et le troisième rectangle sont floutés et ombrés.

Le code correspondant

La feuille de style de cette page

.flou1 {filter : blur(6px);}
.ombrage1{filter : drop-shadow(10px 10px 10px gray) }
.composite1 {filter : blur(4px) drop-shadow(10px 10px 10px gray); }

Les classes correspondent à des filtres définis avec la syntaxe CSS.
Le troisième filtre est composite : flou et ombrage.

Le code HTML & SVG

On applique des filtres définis selon la syntaxe CSS à des éléments HTML puis à des éléments SVG via les mêmes classes CSS.

Qu'en est-il du SVG externe ?

Un document SVG peut comporter une feuille de style avec la définition de filtres selon la syntaxe CSS.
Ces filtres peuvent s'appliquer aux objets SVG du dudit document.

Ci-dessous un document SVG inséré dans cette page web

Le code de ce document SVG

Notez la feuille de style interne dans ce fichier d'extension .svg.
Cette feuille de style comprend trois filtres.
Le canevas proprement dit dessine trois rectangles avec coins arrondis.

Conclusion

Vous avez donc désormais le droit d'oublier tout ce que je viens de dire concernant la définition des filtres selon la syntaxe SVG.
Les filtres avec CSS

Non, j'exagère car si vous utilisez des logiciels tels Inkscape ou Boxy SVG, les filtres seront alors définis selon la syntaxe SVG. Donc il est quand même utile de connaitre cette syntaxe.

Sachez par ailleurs qu'il y a réciprocité : un filtre défini en SVG peut s'appliquer aussi à un élément HTML.
Cette situation était fréquente par le passé puisque la norme CSS2 ignorait encore les filtres alors qu'ils existaient déjà en SVG.
De façon plus générale de nombreuses définitions SVG (filtres & découpes) peuvent s'appliquer non seulement à des objets SVG mais aussi à des 'tags' HTML.