TUTORIEL XML 
Les filtres de SVG
Donnez de la profondeur à vos graphismes vectoriels en leur appliquant des filtres proches de ceux de Photoshop (09/12/2004)

SVG permet de réaliser des graphismes vectoriels dans un format XML. Du fait que SVG fait appel aux vecteurs et non aux pixels pour construire ses images, celles-ci peuvent, si elles ne sont pas travaillées, sembler trop plates ou propres face à ce qu'un graphique construits avec un éditeur bitmap pourrait apporté.

Les concepteurs de SVG ont résolu ce problème en créant les filtres SVG qui, s'ils ne cherchent pas à offrir aux vecteurs les capacités des pixels, permettent d'arriver à un résultat ayant plus de profondeur. Ces filtres permettent ainsi d'obtenir du flou, des ombres, des embossages.

  Forum

Réagissez dans les forums de JDN Développeurs

Le fonctionnement
En pratique, ces filtres agissent une fois le graphique dessiné : ils n'ont dont aucune influence sur leur source, et sont définis à part du conteneur principal :

<defs>
  <filter id="ombrePortee">
    …
  </filter>
</defs>
<g filter="url(#ombrePortee)">
  …
</g>

L'appel du filtre peut également être fait de la manière suivante :

<g style="filter:url(#ombrePortee)">

Ou ne s'appliquer qu'à un élément précis, conteneur ou graphique :

<text filter="url(#ombrePortee)">

Si le filtre est appliqué à un conteneur, il touche tous ses éléments. Les filtres s'appliquent indépendamment les uns des autres, mais peuvent utiliser le résultat d'un filtre précédent par le biais de tampons nommés. Sinon, un filtre travail toujours avec le graphique vectoriel d'origine, inchangé.
Il est donc possible soit de construire une séquence en enchaînant les filtres, soit de créer plus tampon pour chaque filtre et de les lier pour créer le graphique final. Selon qu'un filtre construire sur l'image d'origine ou une image déjà filtrée, le résultat final peut être très différent.

Les filtres
Une quinzaine de filtres de base a ainsi été créée, ainsi que trois éléments servant de source de "lumière". Voici les actions de quelques filtres :

feBlend : fusionne de graphique en un seul, en fonction d'un mode de fusion défini : normal, multiply, screen, darken, lighten.
<filter id="Darken">
  <feBlend mode="darken" in2="Image2" in="SourceGraphic"/>
</filter>

feComposite : crée un composite de deux images.

feGaussianBlur : créé un flou gaussien sur l'image.

fFeOffset : décale l'image d'une certaine distance sur l'axe x et/ou y.

feMerge : permet de mélanger les différents tampons créés par les filtres sur une seule couche.

Un exemple
Voyons comment, à partir d'un graphique classique, réaliser une version plus "vallonnée" : trois cercles de couleur avec ombre portée :

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">

  <defs>
    <filter id="filtre" filterUnits="userSpaceOnUse" x="0" y="0" width="640" height="480">
      <feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
      <feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>
      <feComposite in="blur" in2="SourceAlpha" operator="in" result="specOut"/>
      <feComposite in="SourceGraphic" in2="specOut" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" result="litPaint"/>
      <feMerge>
        <feMergeNode in="offsetBlur"/>
        <feMergeNode in="litPaint"/>
      </feMerge>
    </filter>
  </defs>

  <g style="fill-opacity:0.4; stroke:black; stroke-width:0.1cm; filter:url(#filtre);" >
    <circle cx="6cm" cy="2cm" r="100" style="fill:#FF0000;" transform="translate(0,50)" />
    <circle cx="6cm" cy="2cm" r="100" style="fill:#0000FF;" transform="translate(70,150)" />
    <circle cx="6cm" cy="2cm" r="100" style="fill:#00FF00;" transform="translate(-70,150)"/>
  </g>
</svg>

La succession des filtres se fait ici comme suit : feGaussianBlur créé un flou de nos trois cercles et le stocke sous le nom blur. feOffset prend ce blur est le décale légèrement. feComposite mélange l'image originale et notre blur et stocke le tout dans specOut. feComposite mélange specOut et l'image de base pour stocker le tout dans litPaint. Enfin, feMerge mélange litPaint et offsetBlur.

 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page
 
 





Quand achetez-vous le plus en ligne ?
Du lundi au vendredi
Le samedi
Le dimanche

Tous les sondages