Raconté par Arnaud de Mesmay sur la base d'un cours créé par Rémi Forax et Vincent Jugé.
HTML 5 Canvas | 2014 |
Context 2D | 2015 |
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.
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.
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)
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.
Les couleurs sont les mêmes que les couleurs de CSS.
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.
On définit un gradient circulaire par 2 cercles (x1, y1, r1) (x2, y2, r2).
stroke = trait
fill = remplissage
On peut faire des effets d'ombre en dessinant avec un décalage d'1 ou 2 pixels.
stroke = trait
fill = remplissage
moveTo déplace le crayon,
lineTo place une ligne,
beginPath indique le début d'un chemin,
stroke dessine.
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.
getImageData() renvoie un tableau de pixels.
Chaque pixel est composé de quatre cases rouge, verte, bleue, alpha (opacité).
putImageData() copie le tableau de pixels dans le canvas.
Version avec une seule boucle
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…
Si l'image n'est pas chargée, image.onload est appelée lorsque l'image est chargée.
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 !