1. Introduction au Canvas
<canvas>OuiHTML5Nouvellement ajouté, un élément capable d'utiliser des scripts (généralementJavaScript) pour y dessiner des imagesHTMLélément.
Il a d'abord été utilisé par Apple en interne à l'aide de son propreMacOS X WebKitlancé, pour que des applications utilisent des composants comme Dashboard etSafaril'utilisation du navigateur. Plus tard, quelqu'un viaGeckoles navigateurs à noyau (en particulierMozillaetFirefox),OperaetChromeet le Web Hypertext Application Technology Working Group ont suggéré d'utiliser cet élément pour les technologies web de nouvelle génération.
CanvasestHTMLune zone dessinable définie par le code ainsi que par les attributs height et width.JavaScriptLe code peut accéder à cette zone, comme à d'autres interfaces génériques bidimensionnellesAPI, grâce à un ensemble complet de fonctions de dessin permettant de générer dynamiquement des graphiques.
Les programmes Mozilla le prennent en charge depuis Gecko 1.8 (Firefox 1.5)<canvas>, Internet Explorer à partir d'IE9<canvas>. Chrome et Opera 9+ prennent également en charge<canvas>。
2. Utilisation de base de Canvas
<canvas id="tutorial" width="300" height="300"></canvas>
2.1 <canvas>Élément
<canvas>ressemble à<img>la balise, sauf que<canvas>ne possède que deux attributs optionnelswidth、heigthattributs, et aucunsrc、altdes attributs.
Si vous ne<canvas>setwidht、heightles attributs, alors par défautwidthest 300,heightest 150, et les unités sont toutespx. Vous pouvez également utilisercssattributs pour définir la largeur et la hauteur, mais si les attributs width et height sont incohérents avec le ratio initial, l'image apparaîtra déformée. Par conséquent, il est recommandé de ne jamais utilisercssattributs pour définir<canvas>la largeur et la hauteur.
Contenu de remplacement
Parce que certains navigateurs plus anciens (en particulier les navigateurs IE antérieurs à IE9) ou des navigateurs ne prennent pas en charge l'élément HTML<canvas>, sur ces navigateurs, vous devriez toujours pouvoir afficher le contenu de remplacement.
Prenant en charge<canvas>les navigateurs n'afficheront que<canvas>la balise, et ignoreront le contenu de remplacement à l'intérieur. Les navigateurs qui ne prennent pas en charge<canvas>afficheront directement le contenu de remplacement.
Remplacer par du texte :
<canvas>
你的浏览器不支持 canvas,请升级你的浏览器。
</canvas>
use<img>Remplacement :
<canvas>
<img src="./美女.jpg.html" alt="">
</canvas>
La balise de fermeture</canvas>ne peut pas être omise.
et<img>Contrairement à l'élément,<canvas>l'élément nécessite une balise de fermeture (</canvas>). Si la balise de fermeture n'existe pas, le reste du document sera considéré comme du contenu de remplacement et ne sera pas affiché.
2.2 Contexte de rendu (Le contexte de rendu)
<canvas>créera un canvas de taille fixe et exposera un ou plusieurscontextes de rendu(pinceau), pour utilisercontexte de rendupour dessiner et traiter le contenu à afficher.
Nous nous concentrons sur le contexte de rendu 2D. Nous n'étudierons pas les autres contextes pour l'instant. Par exemple, WebGL utilise un contexte 3D basé sur OpenGL ES ("experimental-webgl").
var canvas = document.getElementById('tutorial');
//获得 2d 上下文对象
var ctx = canvas.getContext('2d');
2.3 Vérification de la prise en charge
var canvas = document.getElementById('tutorial');
if (canvas.getContext){
var ctx = canvas.getContext('2d');
// drawing code here
} else {
// canvas-unsupported code here
}
2.4 Modèle de code
Exemple
Essayez-le maintenant »
2.5 Un exemple simple
L'exemple suivant dessine deux rectangles :
Exemple
Essayez-le maintenant »
3. Dessiner des formes
3.1 Grille(grid)et l'espace de coordonnées
Comme le montre la figure ci-dessous,canvasl'élément est recouvert par une grille par défaut. De manière générale, une unité de la grille équivaut àcanvasun pixel dans l'élément. L'origine de la grille est le coin supérieur gauche, avec les coordonnées (0,0). La position de tous les éléments est définie par rapport à l'origine. Par conséquent, le coin supérieur gauche du carré bleu dans la figure a pour coordonnées (x, y), soit x pixels depuis la gauche (axe X) et y pixels depuis le haut (axe Y).
Plus tard, nous aborderons la translation de l'origine des coordonnées, la rotation de la grille et la mise à l'échelle, etc.

3.2 Dessin de rectangles
<canvas>Un seul type de dessin graphique natif est pris en charge :Rectangle. Tous les autres graphiques nécessitent la génération d'au moins un chemin (path). Cependant, nous disposons de nombreuses méthodes de génération de chemins qui permettent de dessiner des graphiques complexes.
canvas fournit trois méthodes pour dessiner des rectangles :
- 1, fillRect(x, y, width, height): Dessine un rectangle rempli.
- 2, strokeRect(x, y, width, height): Dessine la bordure d'un rectangle.
- 3, clearRect(x, y, widh, height): Efface la zone rectangulaire spécifiée, puis cette zone devient complètement transparente.
Explication :Ces 3 méthodes ont les mêmes paramètres.
- x, y: Désigne les coordonnées du coin supérieur gauche du rectangle. (Par rapport à l'origine des coordonnées du canvas)
- width, height: Désigne la largeur et la hauteur du rectangle à dessiner.


4. Dessin de chemins (path)
L'élément de base du graphisme est un chemin.
Un chemin est un ensemble de points de formes différentes formé en reliant des segments de ligne ou des courbes de couleurs et de largeurs différentes.
Un chemin, ou même un sous-chemin, est fermé.
L'utilisation de chemins pour dessiner des graphiques nécessite quelques étapes supplémentaires :
- Créer le point de départ du chemin
- Appeler des méthodes de dessin pour dessiner le chemin
- Fermer le chemin
- Une fois le chemin généré, affichez le graphique en traçant le contour ou en remplissant la zone du chemin.
Voici les méthodes nécessaires :
-
beginPath()Créer un nouveau chemin. Une fois le chemin créé avec succès, les commandes de dessin graphique sont dirigées vers le chemin pour générer celui-ci.
-
moveTo(x, y)Déplacer le stylo vers les coordonnées spécifiées.
(x, y)Équivalent à définir les coordonnées du point de départ du chemin. -
closePath()Après avoir fermé le chemin, les commandes de dessin graphique sont redirigées vers le contexte.
-
stroke()Dessiner le contour de la forme avec des lignes.
-
fill()Générer une forme pleine en remplissant la zone de contenu du chemin.
4.1 Dessin de segments de ligne
4.2 Dessiner une bordure de triangle

4.3 Remplir un triangle

4.4 Dessiner des arcs
Il existe deux méthodes pour dessiner des arcs :
1, arc(x, y, r, startAngle, endAngle, anticlockwise): avec(x, y)comme centre, avecrcomme rayon, destartAngleradians de début àendAngleradians de fin.anticlosewiseest une valeur booléenne,trueindique le sens antihoraire,falseindique le sens horaire (par défaut, le sens horaire).
Remarque :
Les degrés ici sont tous en radians.
0Les radians font référence à laxdirection positive de l'axe.radians=(Math.PI/180)*degrees //角度转换成弧度
2, arcTo(x1, y1, x2, y2, radius): Trace un arc en fonction des points de contrôle et du rayon donnés, puis relie les deux points de contrôle par une ligne droite.
Exemple d'arc 1

Exemple d'arc 2

Exemple d'arc 3

arcToDescription de la méthode :
Cette méthode peut être comprise comme suit. L'arc à tracer est déterminé par deux droites tangentes.
La première droite tangente : la droite déterminée par le point de départ et le point de contrôle 1.
La deuxième droite tangente : la droite déterminée par le point de contrôle 1 et le point de contrôle 2.
En fait, l'arc tracé est l'arc tangent à ces deux droites.
4.5 Tracé des courbes de Bézier
4.5.1 Qu'est-ce qu'une courbe de Bézier
Une courbe de Bézier, également appelée courbe Bezier, est une courbe mathématique utilisée dans les applications graphiques bidimensionnelles.
Les logiciels de graphiques vectoriels généraux l'utilisent pour dessiner avec précision des courbes. Une courbe de Bézier est constituée de segments de droite et de nœuds. Les nœuds sont des points d'appui déplaçables, et les segments de droite sont comme des élastiques étirables. L'outil plume que l'on voit dans les outils de dessin sert à créer de telles courbes vectorielles.
Les courbes de Bézier sont des courbes paramétriques assez importantes en infographie. Certains logiciels bitmap matures disposent aussi d'outils de courbe de Bézier, comme PhotoShop. Dans Flash4, il n'y avait pas d'outil de courbe complet, mais Flash5 fournissait déjà un outil de courbe de Bézier.
La courbe de Bézier a été largement publiée en 1962 par l'ingénieur français Pierre Bézier, qui l'a utilisée pour concevoir des carrosseries automobiles. La courbe de Bézier a été initialement développée par Paul de Casteljau en 1959 à l'aide de l'algorithme de Casteljau, une méthode numériquement stable pour trouver les courbes de Bézier.
Une courbe de Bézier du premier ordre est en fait une ligne droite.

Courbe de Bézier quadratique


Courbe de Bézier cubique


4.5.2 Tracé des courbes de Bézier
Tracer une courbe de Bézier quadratique :
quadraticCurveTo(cp1x, cp1y, x, y)
Description:
- Paramètres 1 et 2 : coordonnées du point de contrôle
- Paramètres 3 et 4 : coordonnées du point d'extrémité

Tracez une courbe de Bézier cubique :
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
Description:
- Paramètres 1 et 2 : coordonnées du point de contrôle 1
- Paramètres 3 et 4 : coordonnées du point de contrôle 2
- Paramètres 5 et 6 : coordonnées du point d'arrivée

5. Ajout de styles et de couleurs
Dans le chapitre précédent sur le dessin de rectangles, seules les lignes et couleurs par défaut ont été utilisées.
Si vous souhaitez colorer une forme, deux propriétés importantes peuvent le faire.
-
fillStyle = colorDéfinissez la couleur de remplissage de la forme. -
strokeStyle = colorDéfinissez la couleur du contour de la forme.
Notes :
- 1. la couleur peut être une chaîne représentant une valeur de couleur CSS, un objet gradient ou un objet pattern.
- 2. Par défaut, les couleurs de ligne et de remplissage sont toutes les deux noires.
- 3. Une fois que vous avez défini la valeur de strokeStyle ou fillStyle, cette nouvelle valeur devient la valeur par défaut pour les formes nouvellement dessinées. Si vous souhaitez donner une couleur différente à chaque forme, vous devez réinitialiser la valeur de fillStyle ou strokeStyle.
fillStyle

strokeStyle

Transparence
globalAlpha = transparencyValue: Cette propriété affecte la transparence de toutes les formes dans le canvas. Les valeurs valides vont de 0.0 (entièrement transparent) à 1.0 (entièrement opaque), la valeur par défaut est 1.0.
globalAlphaCette propriété est assez efficace lorsque vous devez dessiner de nombreuses formes avec la même transparence. Cependant, je pense qu'il est préférable d'utiliser rgba() pour définir la transparence.
1、style de ligne
Largeur de ligne. Elle ne peut être qu'une valeur positive. La valeur par défaut est 1.0.
La ligne reliant le point de départ et le point d'arrivée est le centre,Le haut et le bas occupent chacun la moitié de la largeur de ligne.。

2. lineCap = type
Style d'extrémité de ligne.
Il y a 3 valeurs :
-
butt: L'extrémité du segment de ligne se termine par un carré. -
round: L'extrémité du segment de ligne se termine par un cercle. square: L'extrémité du segment de ligne se termine par un carré, mais une zone rectangulaire est ajoutée, dont la largeur est la même que le segment de ligne et dont la hauteur est la moitié de l'épaisseur de la ligne.var lineCaps = ["butt", "round", "square"]; for (var i = 0; i < 3; i++){ ctx.beginPath(); ctx.moveTo(20 + 30 * i, 30); ctx.lineTo(20 + 30 * i, 100); ctx.lineWidth = 20; ctx.lineCap = lineCaps[i]; ctx.stroke(); } ctx.beginPath(); ctx.moveTo(0, 30); ctx.lineTo(300, 30); ctx.moveTo(0, 100); ctx.lineTo(300, 100) ctx.strokeStyle = "red"; ctx.lineWidth = 1; ctx.stroke();
3. lineJoin = type
Dans le même chemin, définissez le style des jointures entre les lignes.
Il y a 3 valeurs.
round,beveletmiter:-
roundDessinez la forme du coin en remplissant un secteur supplémentaire dont le centre se trouve à l'extrémité de la partie connectée. Le rayon du coin arrondi correspond à la largeur du segment de ligne. -
bevelRemplissez une zone supplémentaire à base triangulaire à l'extrémité de la partie connectée ; chaque partie a son propre coin rectangulaire indépendant. -
miter(Par défaut) Prolongez les bords extérieurs des parties connectées afin qu'ils se croisent en un point, formant une zone supplémentaire en forme de losange.function draw(){ var canvas = document.getElementById('tutorial'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); var lineJoin = ['round', 'bevel', 'miter']; ctx.lineWidth = 20; for (var i = 0; i < lineJoin.length; i++){ ctx.lineJoin = lineJoin[i]; ctx.beginPath(); ctx.moveTo(50, 50 + i * 50); ctx.lineTo(100, 100 + i * 50); ctx.lineTo(150, 50 + i * 50); ctx.lineTo(200, 100 + i * 50); ctx.lineTo(250, 50 + i * 50); ctx.stroke(); } } draw(); -
fillText(text, x, y [, maxWidth])Remplir le texte spécifié à la position (x, y) spécifiée ; la largeur maximale de dessin est facultative. -
strokeText(text, x, y [, maxWidth])Dessiner une bordure de texte à la position (x, y) spécifiée ; la largeur maximale de dessin est facultative.var ctx; function draw(){ var canvas = document.getElementById('tutorial'); if (!canvas.getContext) return; ctx = canvas.getContext("2d"); ctx.font = "100px sans-serif" ctx.fillText("Si le ciel a des sentiments", 10, 100); ctx.strokeText("Si le ciel a des sentiments", 10, 200) } draw(); -
font = valueLe style que nous utilisons actuellement pour dessiner du texte. Cette chaîne utilise la même syntaxe que laCSS fontpropriété. La police par défaut est10px sans-serif。 -
textAlign = valueOption d'alignement du texte. Les valeurs facultatives incluent :start,end,left,rightoucenter. La valeur par défaut eststart。 -
textBaseline = valueOption d'alignement de la ligne de base, les valeurs facultatives incluent :top,hanging,middle,alphabetic,ideographic,bottom. La valeur par défaut estalphabetic.。 -
direction = valueDirection du texte. Les valeurs possibles incluent :ltr,rtl,inherit. La valeur par défaut estinherit。 -
Les transformations actuellement appliquées (c'est-à-dire la translation, la rotation et la mise à l'échelle)
-
strokeStyle,fillStyle,globalAlpha,lineWidth,lineCap,lineJoin,miterLimit,shadowOffsetX,shadowOffsetY,shadowBlur,shadowColor,globalCompositeOperation 的值 -
Le chemin de découpage actuel (
clipping path)
peut être appelée autant de fois que nécessaire
saveméthode (similaire à celle des tableauxpush()). - a (m11): Mise à l'échelle horizontale.
- b (m12): Inclinaison horizontale.
- c (m21): Inclinaison verticale.
- d (m22): Mise à l'échelle verticale.
- e (dx): Déplacement horizontal.
- f (dy): Déplacement vertical.
Clair
canvasAvant de dessiner chaque image de l'animation, vous devez tout effacer. La façon la plus simple de tout effacer est laclearRect()méthode.Save
canvasstateSi, pendant le processus de dessin, vous allez modifiercanvasl'état du canvas (couleur, origine des coordonnées déplacée, etc.), et si chaque image doit démarrer à partir de l'état d'origine, il est préférable d'enregistrer lecanvasl'état.Dessiner les graphismes de l'animationCette étape est le dessin réel de l'image d'animation
Restaurer
canvasstateSi vous avez sauvegardé lecanvasstate plus tôt, vous devez le restaurer après avoir dessiné une image.canvasl'état.setInterval()setTimeout()requestAnimationFrame()

4. Lignes pointillées
use
setLineDashLa méthode etlineDashOffsetLes propriétés sont utilisées pour définir les styles de lignes pointillées.setLineDashLa méthode accepte un tableau pour spécifier l'alternance des segments de ligne et des espaces ;lineDashOffsetLa propriété définit le décalage de départ.function draw(){ var canvas = document.getElementById('tutorial'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); ctx.setLineDash([20, 5]); //[longueur du trait plein, longueur de l'écart] ctx.lineDashOffset = -0; ctx.strokeRect(50, 50, 210, 210); } draw();
Remarque: getLineDash() renvoie un tableau contenant le style actuel de ligne pointillée, avec une longueur paire non négative.
6. Dessin de texte
Deux méthodes pour dessiner du texte
canvas fournit deux méthodes pour afficher du texte :

Ajout de styles au texte
7. Dessin d'images
Nous pouvons aussi
canvasdessiner des images directement dessus.7.1 Création d'une image à partir de zéro
var img = new Image(); //Créer un élément <img> img.src = 'myImage.png'; //Définir l'adresse source de l'imageUne fois le script exécuté, l'image commence à se charger.
Dessiner
img// 参数 1:要绘制的 img // 参数 2、3:绘制的 img 在 canvas 中的坐标 ctx.drawImage(img,0,0);
Remarque: Étant donné que l'image est chargée depuis le réseau, si
drawImageà ce moment-là, l'image n'a pas été entièrement chargée, alors rien n'est fait, et certains navigateurs peuvent lever une exception. Nous devons donc nous assurer qu'aprèsimgle dessin est terminé, puisdrawImage。var img = new Image(); //Créer un élément img img.onload = function(){ ctx.drawImage(img, 0, 0) } img.src = 'myImage.png'; //Définir l'adresse source de l'image7.2 Dessin
imgImages dans l'élément de balise
imgcannewIl peut également provenir de notre page<img>balise.<img src="./beauty.jpg" alt="" width="300"><br> <canvas id="tutorial" width="600" height="400"></canvas> function draw(){ var canvas = document.getElementById('tutorial'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); var img = document.querySelector("img"); ctx.drawImage(img, 0, 0); } document.querySelector("img").onclick = function (){ draw(); }La première image est celle de la page
<img>balise :
7.3 Mise à l'échelle des images
drawImage()Vous pouvez également ajouter deux paramètres supplémentaires :drawImage(image, x, y, width, height)
Cette méthode possède 2 paramètres supplémentaires :
widthetheight, ces deux paramètres contrôlent l'échelle à laquelle l'image doit être dessinée lorsqu'elle est dessinée dans le canvas.ctx.drawImage(img, 0, 0, 400, 200)

7.4 Découpage (slice)
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
Le premier paramètre est le même que les autres ; il fait référence à une image ou à un autre canvas.
Les 8 autres paramètres :
Les 4 premiers définissent la position et la taille de la découpe de l'image source, et les 4 derniers définissent la position et la taille d'affichage cibles de la découpe.

8. Sauvegarde et restauration de l'état
Saving and restoring stateest une opération essentielle lors du dessin de graphiques complexes.save()etrestore()saveetrestoreLa méthode est utilisée pour sauvegarder et restaurercanvasl'état, et elle ne prend aucun paramètre.
CanvasL'état est un instantané de tous les styles et transformations appliqués au canvas actuel.1. À propos de save() : L'état du canvas est stocké dans une pile. Chaque fois que la méthode save() est appelée, l'état actuel est empilé et sauvegardé.
Un état de dessin comprend :
peut être appelée autant de fois que nécessaire
saveméthode(similaire à celle des tableauxpush()).2. À propos de restore() : Chaque fois que la méthode restore est appelée, le dernier état sauvegardé est dépilé de la pile, et tous les paramètres sont restaurés (similaire à celle des tableaux
pop()).var ctx; function draw(){ var canvas = document.getElementById('tutorial'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); ctx.fillRect(0, 0, 150, 150); //Dessinez un rectangle en utilisant les paramètres par défaut ctx.save(); //Enregistrez l'état par défaut ctx.fillStyle = 'red' //Modifiez la couleur en fonction de la configuration d'origine ctx.fillRect(15, 15, 120, 120); //Dessinez un rectangle en utilisant les nouveaux paramètres ctx.save(); //Enregistrez l'état actuel ctx.fillStyle = '#FFF' //Modifier à nouveau la configuration de couleur ctx.fillRect(30, 30, 90, 90); //Dessiner un rectangle en utilisant la nouvelle configuration ctx.restore(); //Recharger l'état de couleur précédent ctx.fillRect(45, 45, 60, 60); //Dessiner un rectangle en utilisant la configuration précédente ctx.restore(); //Charger la configuration de couleur par défaut ctx.fillRect(60, 60, 30, 30); //Dessiner un rectangle en utilisant la configuration chargée } draw();
9. Transformations
9.1 translate
translate(x, y)Utilisé pour déplacer
canvasdel'originevers une position spécifiée
translateLa méthode accepte deux paramètres.xest le décalage horizontal,yest le décalage vertical, comme le montre la figure à droite.Sauvegarder l'état avant d'effectuer des transformations est une bonne habitude. Dans la plupart des cas, appeler
restorela méthode est bien plus simple que de restaurer manuellement l'état d'origine. De plus, si vous effectuez des translations dans une boucle sans sauvegarder ni restaurercanvasl'état, vous risquez de constater à la fin que quelque chose manque, car cela a probablement dépassécanvasla portée.Remarque :
translateCe qui est déplacé estcanvasl'origine des coordonnées du canvas (transformation de coordonnées).
var ctx; function draw(){ var canvas = document.getElementById('tutorial1'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); ctx.save(); //Sauvegarder l'état avant que l'origine ne soit translatée ctx.translate(100, 100); ctx.strokeRect(0, 0, 100, 100) ctx.restore(); //Restaurer l'état initial ctx.translate(220, 220); ctx.fillRect(0, 0, 100, 100) } draw();
9.2 rotate
rotate(angle)
Faites pivoter les axes de coordonnées.
Cette méthode n'accepte qu'un seul paramètre : l'angle de rotation, qui est dans le sens horaire, en radians.
Le centre de rotation est l'origine des coordonnées.
var ctx; function draw(){ var canvas = document.getElementById('tutorial1'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); ctx.fillStyle = "red"; ctx.save(); ctx.translate(100, 100); ctx.rotate(Math.PI / 180 * 45); ctx.fillStyle = "blue"; ctx.fillRect(0, 0, 100, 100); ctx.restore(); ctx.save(); ctx.translate(0, 0); ctx.fillRect(0, 0, 50, 50) ctx.restore(); } draw();
9.3 scale
scale(x, y)
Nous l'utilisons pour augmenter ou diminuer le nombre de pixels de la forme dans
canvasle canvas, pour réduire ou agrandir les formes et les bitmaps.scaleLa méthode accepte deux paramètres.x,yCe sont les facteurs d'échelle pour l'axe horizontal et l'axe vertical, respectivement, et les deux doivent être des valeurs positives. Une valeur inférieure à 1.0 signifie une réduction, supérieure à 1.0 signifie un agrandissement, et une valeur de 1.0 n'a aucun effet.Par défaut,
canvas1 unité dans le canvas correspond à 1 pixel. Par exemple, si nous définissons le facteur d'échelle sur 0.5, 1 unité devient 0.5 pixels, donc la forme dessinée sera la moitié de l'originale. De même, lorsqu'il est défini sur 2.0, 1 unité devient 2 pixels, et le résultat du dessin est la forme agrandie 2 fois.9.4 transform (matrice de transformation)
transform(a, b, c, d, e, f)
var ctx; function draw(){ var canvas = document.getElementById('tutorial1'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); ctx.transform(1, 1, 0, 1, 0, 0); ctx.fillRect(0, 0, 100, 100); } draw();
10. Composition
Dans tous les exemples précédents, nous dessinons toujours une forme par-dessus une autre. Pour de nombreux autres cas, faire uniquement cela est loin d'être suffisant. Par exemple, pour des graphiques composites, l'ordre de dessin peut être restreint. Cependant, nous pouvons utiliser la propriété globalCompositeOperation pour changer cette situation.
globalCompositeOperation = type
var ctx; function draw(){ var canvas = document.getElementById('tutorial1'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); ctx.fillStyle = "blue"; ctx.fillRect(0, 0, 200, 200); ctx.globalCompositeOperation = "source-over"; //Opérations de composition globale ctx.fillStyle = "red"; ctx.fillRect(100, 100, 200, 200); } draw();Remarque: Dans la démonstration suivante, le bleu est l'original et le rouge est le nouveau.
type est l'une des 13 valeurs de chaîne suivantes :
1. Il s'agit du paramètre par défaut ; la nouvelle image recouvrira l'image d'origine.

2. source-in
Seule la partie où la nouvelle image et l'image d'origine se chevauchent apparaîtra ; toutes les autres zones deviennent transparentes. (Les autres zones de l'ancienne image seront également transparentes.)
3. source-out
Affiche uniquement les parties où la nouvelle image et l'ancienne image ne se chevauchent pas ; le reste est entièrement transparent. (L'ancienne image n'est pas affichée non plus.)

4. source-atop
La nouvelle image n'affiche que la zone de chevauchement avec l'ancienne image. L'ancienne image peut toujours être affichée.

5. destination-over
La nouvelle image sera sous l'ancienne image.

6. destination-in
Seule l'ancienne image dans la partie où la nouvelle et l'ancienne image se chevauchent est affichée ; toutes les autres zones sont transparentes.

7. destination-out
Seules les parties où l'ancienne image et la nouvelle image ne se chevauchent pas. Notez que cela affiche des parties de l'ancienne image.

8. destination-atop
L'ancienne image n'affiche que la partie de chevauchement, et la nouvelle image sera affichée sous l'ancienne image.

9. lighter
Les deux images, nouvelle et ancienne, sont affichées, mais les couleurs de la zone de chevauchement sont traitées de façon additive.

10. darken
Conserve les pixels les plus sombres dans la partie qui se chevauche. (Chaque canal de couleur est comparé, en prenant le plus petit)
blue: #0000FF red: #FF0000
Ainsi, la couleur de la partie qui se chevauche :#000000。

11. lighten
Garantit les pixels les plus lumineux dans la partie qui se chevauche. (Chaque canal de couleur est comparé, en prenant le plus grand)
blue: #0000FF red: #FF0000
Ainsi, la couleur de la partie qui se chevauche :#ff00ff。

12. xor
La partie qui se chevauche devient transparente.

13. copy
Seule la nouvelle image est conservée ; tout le reste est effacé (devient transparent).

11. Tracés de découpe
clip()
Convertir un tracé déjà créé en tracé de découpe.
La fonction d’un tracé de découpe est celle d’un masque. Seule la zone à l’intérieur du tracé de découpe est affichée ; la zone à l’extérieur du tracé de découpe est masquée.
Remarque :clip() ne peut masquer que les images dessinées après l'appel de cette méthode. Si l'image a été dessinée avant l'appel de la méthode clip(), le masquage ne peut pas être réalisé.
var ctx; function draw(){ var canvas = document.getElementById('tutorial1'); if (!canvas.getContext) return; var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.arc(20,20, 100, 0, Math.PI * 2); ctx.clip(); ctx.fillStyle = "pink"; ctx.fillRect(20, 20, 100,100); } draw();
12. Animation
Étapes de base de l'animation
Contrôler l'animation
Nous pouvons utiliser la
canvasdes méthodes ou des méthodes personnalisées pour dessiner l'image sur lecanvascanevas. Normalement, nous ne pouvons voir le résultat du dessin qu'après la fin de l'exécution du script. Par exemple, nous ne pouvons pas réaliser une animation à l'intérieur d'uneforboucle.C'est-à-dire que, pour réaliser une animation, nous avons besoin de méthodes qui peuvent exécuter des redessins à des moments planifiés.
Généralement, les trois méthodes suivantes sont utilisées :
Cas 1 : Système solaire
let sun; let earth; let moon; let ctx; function init(){ sun = new Image(); earth = new Image(); moon = new Image(); sun.src = "sun.png"; earth.src = "earth.png"; moon.src = "moon.png"; let canvas = document.querySelector("#solar"); ctx = canvas.getContext("2d"); sun.onload = function (){ draw() } } init(); function draw(){ ctx.clearRect(0, 0, 300, 300); //Effacer tout le contenu /*Dessiner le Soleil*/ ctx.drawImage(sun, 0, 0, 300, 300); ctx.save(); ctx.translate(150, 150); //Dessiner l'orbite de la Terre ctx.beginPath(); ctx.strokeStyle = "rgba(255,255,0,0.5)"; ctx.arc(0, 0, 100, 0, 2 * Math.PI) ctx.stroke() let time = new Date(); //Dessiner la Terre ctx.rotate(2 * Math.PI / 60 * time.getSeconds() + 2 * Math.PI / 60000 * time.getMilliseconds()) ctx.translate(100, 0); ctx.drawImage(earth, -12, -12) //Dessiner l'orbite de la Lune ctx.beginPath(); ctx.strokeStyle = "rgba(255,255,255,.3)"; ctx.arc(0, 0, 40, 0, 2 * Math.PI); ctx.stroke(); //Dessiner la Lune ctx.rotate(2 * Math.PI / 6 * time.getSeconds() + 2 * Math.PI / 6000 * time.getMilliseconds()); ctx.translate(40, 0); ctx.drawImage(moon, -3.5, -3.5); ctx.restore(); requestAnimationFrame(draw); }
Cas 2 : Horloge analogique
init(); function init(){ let canvas = document.querySelector("#solar"); let ctx = canvas.getContext("2d"); draw(ctx); } function draw(ctx){ requestAnimationFrame(function step(){ drawDial(ctx); //Dessiner le cadran drawAllHands(ctx); //Dessiner les aiguilles des heures, des minutes et des secondes requestAnimationFrame(step); }); } /*Dessiner les aiguilles des heures, des minutes et des secondes*/ function drawAllHands(ctx){ let time = new Date(); let s = time.getSeconds(); let m = time.getMinutes(); let h = time.getHours(); let pi = Math.PI; let secondAngle = pi / 180 * 6 * s; //Calculer les radians de l'aiguille des secondes let minuteAngle = pi / 180 * 6 * m + secondAngle / 60; //Calculer les radians de l'aiguille des minutes let hourAngle = pi / 180 * 30 * h + minuteAngle / 12; //Calculer les radians de l'aiguille des heures drawHand(hourAngle, 60, 6, "red", ctx); //Dessiner l'aiguille des heures drawHand(minuteAngle, 106, 4, "green", ctx); //Dessiner l'aiguille des minutes drawHand(secondAngle, 129, 2, "blue", ctx); //Dessiner l'aiguille des secondes } /*Dessiner l'aiguille des heures, l'aiguille des minutes ou l'aiguille des secondes * Paramètre 1 : l'angle de l'aiguille à dessiner * Paramètre 2 : la longueur de l'aiguille à dessiner * Paramètre 3 : la largeur de l'aiguille à dessiner * Paramètre 4 : la couleur de l'aiguille à dessiner * Paramètre 4 : ctx **/ function drawHand(angle, len, width, color, ctx){ ctx.save(); ctx.translate(150, 150); //Déplacer l'origine des axes de coordonnées vers le centre d'origine ctx.rotate(-Math.PI / 2 + angle); //Tournez les axes de coordonnées. L'axe des x est l'angle de l'aiguille. ctx.beginPath(); ctx.moveTo(-4, 0); ctx.lineTo(len, 0); //Dessinez l'aiguille le long de l'axe des x ctx.lineWidth = width; ctx.strokeStyle = color; ctx.lineCap = "round"; ctx.stroke(); ctx.closePath(); ctx.restore(); } /*Dessinez le cadran*/ function drawDial(ctx){ let pi = Math.PI; ctx.clearRect(0, 0, 300, 300); //Effacez tout le contenu ctx.save(); ctx.translate(150, 150); //Déplacez l'origine des coordonnées vers le centre d'origine ctx.beginPath(); ctx.arc(0, 0, 148, 0, 2 * pi); //Dessinez le cercle ctx.stroke(); ctx.closePath(); for (let i = 0; i < 60; i++){//Dessinez les graduations. ctx.save(); ctx.rotate(-pi / 2 + i * pi / 30); //Faites pivoter les axes de coordonnées. La direction positive de l'axe des x part de la direction vers le haut. ctx.beginPath(); ctx.moveTo(110, 0); ctx.lineTo(140, 0); ctx.lineWidth = i % 5 ? 2 : 4; ctx.strokeStyle = i % 5 ? "blue" : "red"; ctx.stroke(); ctx.closePath(); ctx.restore(); } ctx.restaurer(); }
Essayez-le »
Auteur original : 做人要厚道2013
URL d'origine : https://blog.csdn.net/u012468376/article/details/73350998
-