Votre navigateur a désactivé JavaScript !

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

Méthodologie pour produire du SVG

Saisir le code SVG de rectangles, cercles, ellipses c'est relativement simple surtout si vous avez préparé l'encodage par un croquis sur une feuille à petits carreaux (par exemple un carreau représente 10px).
Par contre l'encodage manuel des chemins (en particulier lorsqu'ils comprennent des arcs) peut provoquer une "prise de tête" ...
Vous avez aussi constaté que le langage SVG peut s'avérer "verbeux" en particulier pour les définitions : filtres, dégradés, motifs, etc.

Le recours à des outils qui génèrent du SVG peut donc s'avérer fort utile.
Vous pouvez recourir à un éditeur graphique de SVG : Inkscape ou Illustrator ou Boxy SVG.
Vous pouvez aussi écrire un script en PHP qui va retourner au navigateur du code SVG.

Production de documents SVG (ou "SVG externe")

En d'autres termes on veut réaliser une image vectorielle statique ou animée au format SVG (extension .svg). Rappelons qu'un document SVG peut comprendre non seulement du code SVG mais aussi du CSS et du JS.

À moins qu'il s'agisse d'images simplistes, il est rare que le code soit saisi de a à z par le développeur. En général le dernier fera appel à un éditeur WYSIWIG (Illustrator ou Inkscape ou Boxy SVG) à un moment donné du processus.

Premier exemple : encodage manuel puis appel à Boxy SVG

Le rendu de la version définitive

Cette image vectorielle statique se nomme "rue_bis.svg".

Première étape : encodage manuel du SVG

Le code correspondant

Je suis parti d'un fichier servant de modèle et nommé "svg_patron.svg" dont le contenu est :

Le rendu à l'issue de la première étape

Deuxième étape : appel à l'éditeur graphique Boxy SVG

Il faut maintenant produire des chemins qui de surcroit sont floutés et il faut importer une image matricielle.
Le nuage blanc dans le ciel et la fumée s'échappant du bus sont des "blobs" c'est à dire des chemins d'arcs donc un code lourd et difficile ...

Démarche : j'ai ouvert "rue.svg" avec Boxy SVG.
Puis j'ai dessiné le nuage blanc et j'ai importé et redimensionné "autobus.png" et j'ai dessiné un nuage de fumée.
J'ai enregistré cette version sous le nom : "rue_bis.svg".

Le code de "rue_bis.svg" est alors (extraits) :

Deux chemins sont rajoutés ; ils correspondent aux 'blobs' (chemins d'arcs).

L'image importée est "rastérisée dans le document :

Notez que le code SVG généré est plus verbeux que celui qui découlerait d'un encodage manuel car tous les attributs possibles sont mentionnés avec éventuellement des valeurs à zéro ou à ""
Le document a un peu grossi ; il passe de 3 KO à 13 KO.
La différence est surtout dûe à la "rastérisation" de l'image importée.

Exemple 2 : utilisation de Inkscape puis encodage manuel

Dans ce deuxième exemple je crée un premier "jus" avec Inkscape puis j'encode manuellement.
Ce cas de figure est fréquent lorsque l'on veut passer d'un dessin vectoriel statique à un dessin vectoriel animé car Inkscape ne propose pas de module "animations".

Étape 1 : le dessin vectoriel statique

Ci-dessous le document SVG produit avec Inkscape : "croix_lorraine.svg"

Le code correspondant :

Pour obtenir ce code j'ai d'abord bien paramétré la boite de dialogue "Propriétés du document" afin de générer un viewBox et que l'unité de mesure soit le pixel.
J'ai dessiné trois rectangles qui se croisent puis j'ai supprimé les contours, j'ai groupé les trois formes et j'ai rempli de bleu et j'ai appliqué une ombre portée.
J'ai enregistré le document selon le type "svg optimisé".

Étape 2 : encodage manuel

J'ai ouvert "croix_lorraine.svg" sous NotePad.
J'ai rajouté une feuille de style interne.
J'ai modifié le code de la balise G : remplacer fill ="blue" par class ="couleur"

Le code définitif

Notez bien le code de la balise G : <g class ="couleur" filter="url(#a)">

Observez attentivement le contenu de STYLE : un modèle d'animation nommé "tricolorer" concernant la couleur de remplissage.

Destinés initialement à animer des éléments HTML, les "keyframes" CSS peuvent aussi s'appliquer à des objets SVG.
Les animations avec CSS 3

Insérer l'image vectorielle animée dans une page web

Si une image vectorielle animée ne comprend que de SVG et du CSS elle peut être insérée comme une image matricielle, c'est à dire via l'élément IMG. C'est le cas ici !
Par ailleurs cette image ne pèse qu'un KO !

Le rendu

Ci-dessous le texte de l'appel du 18 juin encadre le document SVG en miniature :

Les chefs qui, depuis de nombreuses années, sont à la tête des armées françaises, ont formé un gouvernement. Ce gouvernement, alléguant la défaite de nos armées, s'est mis en rapport avec l'ennemi pour cesser le combat.
Certes, nous avons été, nous sommes submergés par la force mécanique, terrestre et aérienne de l'ennemi.
Infiniment plus que leur nombre, ce sont les chars, les avions, la tactique des Allemands qui nous font reculer. Ce sont les chars, les avions, la tactique des Allemands qui ont surpris nos chefs au point de les amener là où ils en sont aujourd’hui.
Mais le dernier mot est-il dit ? L'espérance doit-elle disparaître ? La défaite est-elle définitive ? Non  !
Croyez-moi, moi qui vous parle en connaissance de cause et vous dis que rien n’est perdu pour la France. Les mêmes moyens qui nous ont vaincus peuvent faire venir un jour la victoire.
Car la France n'est pas seule ! Elle n'est pas seule ! Elle n'est pas seule ! Elle a un vaste Empire derrière elle. Elle peut faire bloc avec l'Empire britannique qui tient la mer et continue la lutte. Elle peut, comme l'Angleterre, utiliser sans limites l'immense industrie des Etats-Unis. Cette guerre n'est pas limitée au territoire de notre malheureux pays. Cette guerre n'est pas tranchée par la bataille de France. Cette guerre est une guerre mondiale. Toutes les fautes, tous les retards, toutes les souffrances n'empêchent pas qu'il y a, dans l'univers, tous les moyens pour écraser un jour nos ennemis. Foudroyés aujourd'hui par la force mécanique, nous pourrons vaincre dans l'avenir par une force mécanique supérieure. Le destin du monde est là. Moi, général de Gaulle, actuellement à Londres, j'invite les officiers et les soldats français qui se trouvent en territoire britannique ou qui viendraient à s'y trouver, avec leurs armes ou sans leurs armes, j'invite les ingénieurs et les ouvriers spécialisés des industries d'armement qui se trouvent en territoire britannique ou qui viendraient à s'y trouver, à se mettre en rapport avec moi. Quoi qu'il arrive, la flamme de la résistance française ne doit pas s'éteindre et ne s'éteindra pas.

Le code HTML correspondant

Cette image vectorielle animée se comporte tel un gif animé ...

Utiliser successivement Inkscape puis Boxy SVG

Je vous propose maintenant d'utiliser successivemen Inkscape puis Boxy SVG (donc aucun encodage manuel).

Inkscape et Boxy SVG se complètent

Inkscape & Boxy SVG ont chacun des avantages et inconvénients.
Lorsqu'on demande l'importation d'une image matricielle, Inskcape vous propose le choix entre l'incorporation et une simple liaison. Alors qu'avec Boxy SVG, l'image est obligatoirement "rastérisée" dans le document SVG.
Boxy SVG est capable de générer le code SMIL pour des animations d'objets alors qu'Inkscape ne propose pas de module d'animation.

Aussi l'idée est de démarrer la production d'un document SVG avec Inkscape pour bénéficier des avantages de la liaison puis de terminer la réalisation avec Boxy SVG pour bénéficier de son module animation.

Le document SVG "ink_boxy.svg"

Cliquez sur le skieur pour lancer l'animation

Ce document comprend une liaison avec une image externe ; il doit être inséré dans la page web avec la balise object (ou iframe).

Le code SVG de ce document

Ce document SVG ne pèse qu'1 KO grâce à l'utilisation de liaisons (et non pas d'incorporation des images matricielles).
Les images liées sont bien sûr dans le même dossier que le fichier SVG.
Le fichier SVG dépend des images ; lors du téléversement de ce document vers votre hébergeur, pensez à transférer aussi les images.

Ma démarche

Sous Inkscape :
Sous Boxy SVG :
Finalisez avec un éditeur de textes :

En résumé

La connaissance des avantages mais aussi des limites des éditeurs WYSIWYG de SVG ainsi que la maitrise du langage SVG vous permettent de produire rapidement un document SVG avec un code optimisé (léger et facile à comprendre).

Vous trouverez dans mon site un tuto sur Inkscape et un autre sur Boxy SVG.
Mon tuto sur Inkscape
Mon tuto sur Boxy SVG

Publication de documents SVG sur les plateformes

Essayez de publier une image au format SVG sur Facebook, Wordpress, Linkedin, etc.
À chaque tentative c'est un échec. Ces plateformes n'acceptent que des images matricielles (png,jpg,gif) et ce pour des raisons de sécurité. En effet un document SVG peut contenir du JS malveillant. Par exemple le script charge un fichier JS qui prend le contrôle de la machine du visiteur.

Heureusement il est très facile de convertir un fichier .svg en fichier .png. Vous pouvez utilisez Inkscape mais aussi une application en ligne comme https://svgtopng.comb.
Cette version png peut être publiée sur les plateformes déjà citées. Mais l'animation n'est pas préservée ...

Production de SVG interne

Depuis la norme HTML5 le SVG peut être contenu dans un document HTML (une page web) ; on parle alors de "SVG interne" ou encore de "SVG dans le HTML". Mais comment produire rapidement du "SVG dans le HTML" ?

Utiliser un éditeur graphique

Vous pouvez utiliser Inkscape ou Boxy SVG pour obtenir un document SVG provisoire. Puis vous collez le contenu de ce fichier .svg vers la page web et dans cette dernière il suffit de procéder à quelques corrections.

Paradoxalement le code SVG interne est plus permissif que le code d'un document SVG. En effet les "namespace" 'de la balise SVG début) sont alors facultatifs.
Par contre il faut que la valeur de l'attribut width soit un pourcentage afin que le canevas soit "responsive".
Il faut aussi rajouter éventuellement dans la balise SVG début, l'attribut viewBox

Exemple : utiliser Inkscape

Le code du document SVG
Conversion en SVG interne

Je copie le code dans ce document HTML et je le corrige afin d'obtenir le code suivant dans la page web cible.

Donc je me suis contenté de modifier le code de la balise SVG début.

Le rendu du SVG interne

Faire appel à PHP

Comme HTML, le langage SVG ne propose pas nativement de variables et de structures de contrôle (tests, boucles).
Par contre PHP est un véritable langage de programmation ... côté serveur.
Un bref script PHP peut générer beaucoup de SVG dans le cadre d'un code répétitif.

Exemple

Ci-dessous une page web contenant un canevas SVG rempli via PHP :

Le code de ce document PHP(extrait)

Le script PHP comprend une boucle qui est répétée 15 fois.
À chaque passage dans la boucle un objet rect est dessiné dans le canevas.
Le code SVG retourné au navigateur :

Donc via un script PHP très concis je génère beaucoup de code SVG.

Utiliser un framework JavaScript dédié SVG

Vous pouvez faire appel à un framework JavaScript chargé spécialisé dans la génération de code SVG.
Il existe de nombreuses librairies JS pour générer du SVG mais la plus connue est Snap SVG
Grâce à la puissance de JavaScript et la richesse des méthodes de cette librairie, vous obtenez un script très concis.

Dessin du beau paysage via Snap SVG

Reprenons la thématique : la route bordée de peupliers ...

Le code correspondant dans cette page web

Le code rajouté dans la partie HEAD du document HTML :

Il faut bien sûr charger le fichier.js correspondant au framework et il faut avertir le visiteur que s'il a désactivé JavaScript il se prive du dessin ...

Instruction HTML pour dessiner un canevas vide :
< svg width ="60%" id ="canevas10" viewBox ="0 0 900 600" style ="border : 1px solid black;" >

Le script qui suit cette instruction HTML :

	var s = Snap("#canevas10");
	// définition des filtres
	var flou1 = s.filter(Snap.filter.blur(20,20));
	var ombre1 = s.filter(Snap.filter.shadow(10, 10, .5));

	// définition d'un filtre : floutage
	// le ciel et la terre 
	s.rect(0, 0, 900,300).attr({fill: 'skyblue'});
	s.rect(0,300,900,300).attr({fill: 'lime'});
	// la route et le soleil
	s.path('M 300,600 L 500,300 L 600,300 L 500,600 z').attr({fill : 'grey'});
	s.rect(25,25,150,150,75).attr({fill : 'orange', filter :flou1}); 
	 
	// modèle de peuplier
	var tronc = s.rect(275,500,25,100).attr({fill: 'brown'}); 
	var feuillage = s.ellipse(287,425,50,125).attr({fill: 'green'});
	var arbre = s.group(tronc,feuillage).attr({filter : ombre1}); 
	
	// clonage du modèle
	arbre.clone().transform('t50-50 s.9');
	arbre.clone().transform('t100-100 s.8'); 
	arbre.clone().transform('t150-150 s.7');
	arbre.clone().transform('t200-200 s.6');
	
	// le chêne
	s.rect(650,300,200,200,100).attr({fill : 'darkgreen', filter : ombre1}); 
	s.rect(750,475,25,100).attr({fill : 'brown', filter : ombre1}); 

N'oubliez pas de fermer la balise double SVG :
< /svg >

Tout ce code JS-Snap doit bien sûr être inclus dans le conteneur SCRIPT.
Pour encoder rapidement ce script il est préférable de réaliser auparavant un croquis sur papier à petits carreaux. Ainsi vous avez en lecture directe les paramètres géométriques des objets.
Notez que le script est très concis.
Remarquez aussi que je ne dessine pas de cercles mais des carrés avec coins arrondis. Ainsi pour toutes les formes (sauf ellipses) j'ai toujours les mêmes arguments : x,y,w,h,[r]

Pour en savoir davantage

Je ne vais pas commenter ici ce script car vous trouverez dans mon site un Tuto sur Snap SVG
Vous verrez que Snap SVG permet de générer le code pour des images statiques mais aussi pour des images animées. Donc qu'il s'agit d'un outil intéressant.