JavaScript


Canvas

Raconté par Arnaud de Mesmay sur la base d'un cours créé par Rémi Forax et Vincent Jugé.

Historique des versions

La spécification est en 2 parties :
  1. un élément canvas
  2. un objet context 2D

HTML 5 Canvas 2014
Context 2D 2015

L'API Canvas

permet de dessiner avec JavaScript sur un canvas HTML.

                    
<canvas id="canvas-example1"
        width="300"
        height="180"></canvas>

Un canvas est vu comme une image sur laquelle on peut dessiner.

Le context 2D

On récupère l'élément Canvas par son nom
puis on demande le contexte de dessin 2D pour dessiner.



Il existe aussi un context 3D, défini par la specification WebGL.

Les coordonnées

Le point (x = 0, y = 0) est en haut à gauche.

x : coordonnée sur l'axe horizontal (vers la droite)
y : coordonnée sur l'axe vertical (vers le bas)



L'état du context

La façon d'afficher dépend de l'état de propriétés du context.


Par exemple, l'affichage de la couleur du bord d'un rectangle dépend de la propriété stokeStyle.

Couleur

Les couleurs sont les mêmes que les couleurs de CSS.



Gradient linéaire

On définit un gradient linéaire par deux points (x1, y1) (x2, y2) puis plusieurs couleurs (color stops) sur une échelle entre 0 et 1.

Gradient circulaire

On définit un gradient circulaire par 2 cercles (x1, y1, r1) (x2, y2, r2).

opérations sur un canvas

  • Afficher un texte
  • Afficher une figure simple
  • Afficher des figures complexes
  • Afficher une image
  • Gestion des événements

Afficher un texte

stroke = trait
fill = remplissage


On peut faire des effets d'ombre en dessinant avec un décalage d'1 ou 2 pixels.

Afficher un rectangle

stroke = trait
fill = remplissage



Afficher une ligne

moveTo déplace le crayon, lineTo place une ligne,
beginPath indique le début d'un chemin, stroke dessine.



Style d'une ligne



lineWidth:
épaisseur du trait
lineCap: butt | round | square
bout des lignes
lineJoin: bevel | round | miter
jointure entre les lignes

Afficher un cercle/ellipse

arc(x, y, radius, startAngle, endAngle)
Les angles sont en radians !

Le point d'angle 0 est au centre à droite et on tourne dans le sens des aiguilles d'une montre.

Tableau de pixels

getImageData() renvoie un tableau de pixels.


Chaque pixel est composé de quatre cases rouge, verte, bleue, alpha (opacité).

Tableau de pixels (2)

putImageData() copie le tableau de pixels dans le canvas.


Version avec une seule boucle

Afficher une image (1/3)

Il faut que l'image soit chargée avant de pouvoir la dessiner 
si l'image est déjà dans la page, pas de problème…

HTML-5


Afficher une image (2/3)

Si l'image n'est pas chargée, image.onload est appelée lorsque l'image est chargée.



Afficher une image (3/3)

On peut spécifier onload en utilisant une closure, ce qui évite de devoir trouver un nom à la fonction.


C'est une closure car les variables context et image sont prises du scope englobant !

Un exemple

Voici un exemple de ce qu'on peut faire en combinant des classes, des évènements et le canvas. C'est un bon exercice de plonger dans le code source et de comprendre comment tout s'imbrique ensemble.