Aller au menu - Aller au contenu

Raphaël 1.5 : le dessin vectoriel à la portée de tous les navigateurs !

Revenir à la liste des news
Participer à la discussion

Image

Informations

Contributeur(s) : bluestorm, Éfrit et Marin M.
Publié : le 27/08/2010 à 16:54:29
Catégorie : Web
Visualisations : 17 032

Licence : Creative Commons BY SA

Raphaël 1.5 : le dessin vectoriel à la portée de tous les [...]

La version 1.5 de la bibliothèque JavaScript libre Raphaël vient de sortir. Elle permet de produire en ligne des dessins et animations vectorielles, en produisant des documents SVG. Pour Internet Explorer qui ne gère pas encore ce format, Raphaël génère des documents VML, ce qui lui permet d’être compatible avec tous les navigateurs récents, ainsi qu’avec Internet Explorer depuis sa version 6. Son code source est disponible sous licence MIT.

Un peu d’histoire


En 1998, le W3C (l’organisme qui définit les normes du web), a voulu établir un nouveau langage, basé sur le XML, permettant de créer des images vectorielles. Une image vectorielle, en opposition aux images matricielles ou bitmap (PNG, BMP, GIF, JPEG…) qui elles enregistrent chaque pixel, sauvegarde chaque composant géométrique du dessin (ligne, polygone, carré, ellipse, texte, courbes…). Cela permet la plupart du temps un poids réduit, mais aussi la possibilité d’agrandir à l’infini l’image sans perte de qualité : en effet, si une image matricielle ne fait qu’agrandir des carrés, ce qui pixelise l’image, une image vectorielle agrandit des formes géométriques. Voici ce qui se passe par exemple si on agrandit une image vectorielle, et ce qui se passe si on agrandit une image bitmap :
Image utilisateurImage utilisateurImage utilisateur
Image vectorielle

Image utilisateurImage utilisateurImage utilisateur
Image matricielle

Le W3C voulait donc créer un nouveau langage de création d’images vectorielles avec, comme le HTML, des balises. Deux propositions lui sont parvenues :
  • Le VML, proposé par Autodesk (l’auteur de Maya), HP, Macromedia (l’auteur de Flash à l’époque), Microsoft et Visio
  • Le PGML, proposé par Adobe (qui n'avait pas encore racheté Macromedia) et Sun
Le W3C a choisi de fusionner les deux, pour créer le SVG. Retour en 2010, le SVG a beaucoup d’atouts pour remplacer le Flash. Comme lui, il se base sur des graphismes vectoriels, et peut exécuter du code JavaScript, sur lequel l’ActionScript du Flash est basé, afin de rendre les applications interactives. Par rapport au Flash, il a des avantages :
  • Il est libre
  • Pas de plug-in à installer, il est reconnu nativement par le navigateur
  • Pas besoin de payer pour créer des applications basées dessus
Mais aussi des inconvénients :
  • L’interface de programmation DOM, utilisée pour parcourir en JavaScript les éléments d’une page HTML, aussi utilisée par le SVG, n’est pas des plus adaptées
  • Si le navigateur ne reconnaît pas le SVG, il faut un plug-in
Microsoft a implémenté le VML dans toutes les versions d’Internet Explorer depuis la sixième, tandis que tous les autres navigateurs récents ont implémentés le SVG et que ce dernier sera présent dans Interner Explorer 9, qui sortira bientôt.

Voici à quoi ressemble un code SVG :

Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<svg
   xmlns="http://www.w3.org/2000/svg" 
   version="1.1"
   width="300"
   height="200">
  <title>Exemple simple de figure SVG</title>
   <!-- ceci est un commentaire-->
  <rect
     width="100" height="80"
     x="0" y="70"
     fill="green" />
  <line
     x1="5" y1="5"
     x2="250" y2="95"
     stroke="red" />
  <circle
     cx="90" cy="80"
     r="50"
     fill="blue" />
   <text x="180" y="60">
     Un texte
   </text>
</svg>

Ce qui donne :



Bien sûr, le créateur de l’image n’est pas obligé de la créer comme ça, avec un simple éditeur de texte, il peut aussi la dessiner avec un logiciel de dessin, comme Inkscape Image utilisateur. Il a la possibilité ensuite, à l’aide de la balise <script> , d'ajouter du JavaScript. Avec un éditeur, il est également possible de créer des images beaucoup plus riches que l'exemple ci-dessus.


Et vint Raphaël


Mais un jour fut créée Raphaël, une bibliothèque JavaScript, destinée spécialement à créer facilement des applications en SVG, ce qui règle le premier problème. En ce qui concerne la compatibilité, Raphaël s’en occupe aussi : si l’utilisateur navigue avec Internet Explorer 6, 7 ou 8, le navigateur génère du VML à la place du SVG, ce qui rend la bibliothèque compatible avec la quasi-totalité des navigateurs actuels (Firefox 3.0 ou plus et les navigateurs basés dessus, les navigateurs récents basés sur WebKit, le moteur de Chrome  / Naveo / Epiphany / Midori / Safari / OpenTiger / Konqueror / zNavigo / Safari iPhone / etc., Opera 9.5 ou plus, Internet Explorer 6.0 ou plus et les navigateurs basés sur ce dernier) !

Raphaël s’intègre directement dans une page web, comme jQuery par exemple, pas besoin de toucher à du code SVG. Un document SVG peut cependant être converti en code Raphaël. Voici un exemple de code :

Code : JavaScript
1
2
3
4
5
6
7
// Créer une zone de dessin dans le <div> ayant pour paramètre id « zone »
var zone = Raphael("zone", 320, 200);

// Dessiner un cercle dans la zone de dessin aux coordonnées 50, 40 au rayon de 10 pixels
var circle = zone.circle(50, 40, 10);
circle.attr("fill", "#f00"); // Couleur de remplissage : #f00
circle.attr("stroke", "#fff"); // Couleur de la bordure : #fff

Mais Raphaël ne se limite pas à ça, et dispose de nombreuses fonctionnalités, permettant par exemple de manipuler ou d'animer des objets, ou d'interagir avec l'utilisateur. Vous pouvez voir les fonctionnalités de Raphaël à travers les exemples, ou en lisant la documentation (malheureusement plutôt pauvre).
Il existe enfin une surcouche de Raphaël, nommée gRaphaël, qui est spécialisée dans le rendu de diagrammes en tous genres.

Les nouveautés


Les attributs personnalisés


Raphaël permet de modifier les attributs des objets du document SVG : changer la taille d'un segment, le déplacer, changer sa couleur... C'est sur cela que se basent les animations : on spécifie la valeur de l'attribut à laquelle on veut arriver, et le moteur de rendu se charge de faire une transition douce entre l'état actuel et cette valeur. Par exemple, si on demande de changer la couleur, il fera un dégradé progressif dans le temps.

Les attributs personnalisés permettent de créer de nouveaux attributs qui "regroupent" plusieurs attributs SVG existants. Par exemple, si on veut faire évoluer en même temps la taille d'un quartier de cercle et sa couleur, on peut maintenant combiner ces deux attributs dans un nouvel attribut "personnalisé", qui fait les calculs pour choisir la taille et la couleur à donner au cours de l'animation.

Code : JavaScript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
r.customAttributes.segment = function (x, y, r, a1, a2) {
    var flag = (a2 - a1) > 180,
        clr = (a2 - a1) / 360;
    a1 = (a1 % 360) * Math.PI / 180;
    a2 = (a2 % 360) * Math.PI / 180;
    return {
        path: [["M", x, y],
               ["l", r * Math.cos(a1), r * Math.sin(a1)],
               ["A", r, r, 0, +flag, 1, x + r * Math.cos(a2),
                                        y + r * Math.sin(a2)], ["z"]],
        fill: "hsb(" + clr + ", .75, .8)"
    };
};


Dans cet exemple, on a créé un attribut personnalisé segment, qui règle à la fois la forme (attribut SVG path) et la couleur (attribut SVG fill) d'un objet.

Ensuite, on n'a plus qu'à combiner ça avec un peu de code qui repère les clics de souris et anime une augmentation de cet attribut "segment", et on obtient ce magnifique exemple, que vous pouvez tester si votre navigateur le supporte.



N'hésitez pas à regarder le code de la page, il contient le code Javascript complet. Si votre navigateur le permet, vous pouvez même observer l'évolution du document SVG en direct pendant que vous jouez avec l'exemple.
Sous Chrome par exemple, clic droit sur la tarte > "Procéder à l'inspection de cet élément".

Image utilisateur
Illustration : une image SVG plus riche, créée avec Inkscape.
licence CC-BY-SA : Image utilisateur (SVG), par Noémie Scherer.


Les images-clés (keyframes)


La formule de base pour les animations est donc de donner l'état auquel on veut arriver, et le moteur de rendu du navigateur web calcule tout seul les états transitoires à utiliser (trajectoire d'un point, dégradé des couleurs, etc.). On peut spécifier un peu la façon dont il choisit ses transitions (vitesse constante, départ plus en douceur, etc.) mais ça reste assez rigide : si on veut lui demander d'aller de A à B en passant par un point C bien précis qui n'est pas du tout entre les deux, il faut faire deux animations à la suite, de A à B puis de B à C.

Les keyframes permettent une certaine flexibilité, en permettant de découper une seule animation en différentes "tranches" qui se comportent différemment.

Par exemple, dans l'exemple ci-dessous (encore une fois tiré d'une vraie animation), on découpe l'animation en cinq étapes (de 0% à 20%, de 20% à 40%..) en spécifiant à chaque fois l'état à atteindre. À chaque étape, la position verticale de l'objet à animer change de direction (attribut cy), et un point différent de l'animation subit un dégradé (par la fonction utilisateur fade).

Code : JavaScript
1
2
3
4
5
6
7
c.stop().animate({
    "20%": {cy: 200, easing: ey, callback: fade(0)},
    "40%": {cy: 100, easing: ey, callback: fade(1)},
    "60%": {cy: 200, easing: ey, callback: fade(2)},
    "80%": {cy: 300, easing: ey, callback: fade(3)},
    "100%": {cy: 200, easing: ey, callback: fade(4)}
}, 5000)



Les deux listes permettent de choisir la méthode de transition (vitesse constante, etc..) indépendamment pour la position verticale et horizontale de l'objet.

Liens externes



En savoir plus avec le Site du Zéro :


Le site du zéro contient une section de tutoriels Dessin vectoriel, qui n'attend qu'à être plus remplie. Elle contient un tutoriel sur la vectorisation noir et blanc (transformation d'image matricielle en image vectorielle), et un tutoriel inachevé sur SVG qui présente les bases du format, pour pouvoir comprendre le code source des documents produits par Raphaël, Inkscape ou un éditeur de texte.

Plusieurs news ont aussi traité de l'actualité du dessin vectoriel :

64 Participations

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3 
Pseudo Discussion
3 visiteurs sur cette news (0 membre et 3 anonymes)
Page Précédente  1  2  3 
Hors ligne Anonyme # Posté le 30/08/2010 à 14:12:52

Citation : bluestorm
Les performances des ordinateurs s'amélioraient aussi vite il y a 10 ans que maintenant, à l'ère du multi-cœur et compagnie. Si on passe à un modèle multicœur c'est surtout parce qu'on n'arrive plus trop en ce moment à aller plus vite sur un seul cœur.

C'est bien ce que je dis, avant qu'apparaissent les processeurs multi-coeurs, tout était concentré en un seul coeur, et les processus se jonglaient les uns après les autres dessus, et étant donné qu'on avait atteint la limite des performances d'un coeur, la rapidité d'exécution des programmes multi-tâche stagnaient... Des scientifiques ont donc eu l'idée très ingénieuse d'assembler plusieurs coeurs cote à cote et où l'on répartissait les tâches. Avant pour deux instructions sur un intervalle de temps x, on en a maintenant 4-8 instructions. C'est un gain énorme. Il est évident que c'est une révolution.

Citation : bluestorm
Les questions de parallélisme/concurrence/synchronisation que cela soulève ont plus tendance, à puissance de calcul équivalente, à diminuer la rapidité, ou en tout cas à complexifier les programmes et augmenter les bugs. Indépendamment des questions d'utilisation optimale des ressources (qui sont plus concernées par les approches SMT et cie.).

Si vrai qu'il est très difficile de réaliser des programmes multi-threading de nos jours dans le sens où il faut être extrêmement vigilant. Mais aujourd'hui beaucoup de bibliothèques/langages nous simplifie grandement la vie pour ce genre de chose, je pense notamment à Qt et à Boost en C++. Les avantages sont donc bien réel, mais il est vrai qu'on se soucie de moins en moins si au final on aura plutôt un gain qu'une perte de performance ce qui est dommage autant fermer les yeux sur ce point dans ce cas.

Citation : bluestorm
SVG est juste un format de représentation de données. Il n'est, en soit, ni compilé ni interpreté.

Lorsqu'on fournis un document SVG à un navigateur internet par exemple, il faut bien que le document soit analyser pour pouvoir l'afficher. Il est donc bel et bien interprété non ?

Citation : bluestorm
Quant à Javascript, ce que sont en train de faire toutes les implémentations en vogue en ce moment c'est de passer des interprète naïfs qu'on avait au départ vers des méthodes sophistiquées de compilation (JIT etc.). Les parties les plus dynamiques de Javascript (eval, etc.) sont justement les plus casse-pieds à optimiser.

C'est dommage, je suis persuadé que l'interprèté à un avenir. Peut-être que c'est du fait que les processeurs conçu pour le mutli-tâche ne sont pas encore largement diffusé... Dans quelques années ils feront sans doute marche arrière.
Hors ligne Nicolas M. # Posté le 30/08/2010 à 14:20:18
M(NiCoLaSm) = 406,9 g/mol
Avatar

Ville : Notre-dame de bondeville
Pays : France métropolitaine

Pourquoi faire marche arrière si le code compilé est de toute façon plus rapide que l'interprété ? Même si un multi-cœurs gère sans problème l'interprétation, on ne va pas marcher à reculons s'il y a plus rapide ! o_O

Image utilisateur Image utilisateur

Le saviez-vous ? Les forums sont environ 283 174 fois plus efficaces que ma boîte MP pour vous aider. ;)
Image utilisateur
 
Hors ligne anonyme # Posté le 30/08/2010 à 14:23:23

Le compilé a aussi ses défauts... Dans ce cas tout les langages du genre PHP, Python, etc... à la corbeille et retour au sources : C, C++, Pascal...
Hors ligne SpaceFox # Posté le 30/08/2010 à 14:25:18
Utilise ton cerveau !
Avatar
Validateurs
Flux RSS

Études : UTT

Tu devrais te renseigner sur ce qu'est la "compilation JIT" dont parle Bluestorm, au lieu d'affimer des choses.

Image utilisateur
 
Pour accéder à cette section
Connectez-vous !
connexion_rpx

Revenir à la liste des news