Après avoir expérimenté des opérations composites et dessiné des images sur la toile, j'essaie maintenant de supprimer les images et le compositing. Comment puis-je faire cela?
J'ai besoin d'effacer la toile pour redessiner d'autres images; cela peut durer un certain temps, donc je ne pense pas que dessiner un nouveau rectangle à chaque fois soit l'option la plus efficace.
javascript
html
canvas
html5-canvas
composite
Richard
la source
la source
clearRect
vous devez soit avoir un contexte non transformé, soit garder une trace de vos limites réelles.context.clearRect(0, 0, context.canvas.width, context.canvas.height)
. C'est effectivement la même chose mais une dépendance en moins (1 variable au lieu de 2)Utilisation:
context.clearRect(0, 0, canvas.width, canvas.height);
C'est le moyen le plus rapide et le plus descriptif pour effacer l'intégralité du canevas.
Ne pas utiliser:
canvas.width = canvas.width;
La réinitialisation
canvas.width
réinitialise tous les états du canevas (par exemple les transformations, lineWidth, strokeStyle, etc.), elle est très lente (par rapport à clearRect), elle ne fonctionne pas dans tous les navigateurs et ne décrit pas ce que vous essayez réellement de faire.Gérer les coordonnées transformées
Si vous avez modifié la matrice de transformation (par exemple , en utilisant
scale
,rotate
outranslate
) alorscontext.clearRect(0,0,canvas.width,canvas.height)
ne sera probablement pas effacer toute la partie visible de la toile.La solution? Réinitialisez la matrice de transformation avant d'effacer le canevas:
Éditer: je viens de faire du profilage et (dans Chrome), il est environ 10% plus rapide pour effacer un canevas 300x150 (taille par défaut) sans réinitialiser la transformation. À mesure que la taille de votre toile augmente, cette différence diminue.
C'est déjà relativement insignifiant, mais dans la plupart des cas, vous tirerez beaucoup plus que vous ne supprimez et je pense que cette différence de performances n'est pas pertinente.
la source
canvas
variable locale en utilisant à lactx.canvas
place.canvas.width
etcanvas.height
lors de l'effacement. Je n'ai pas fait d'analyse numérique sur la différence d'exécution par rapport à la réinitialisation de la transformation, mais je pense que cela améliorerait légèrement les performances.Si vous dessinez des lignes, assurez-vous de ne pas oublier:
Sinon, les lignes ne seront pas effacées.
la source
beginPath
lorsque vous commencez un nouveau chemin , ne supposez pas cela simplement parce que vous effacez la toile que vous souhaitez également effacer votre chemin existant! Ce serait une pratique horrible et une façon à l'envers de voir le dessin.beginPath
ne supprime rien de votre canevas, il réinitialise le chemin afin que les entrées de chemin précédentes soient supprimées avant de dessiner. Vous en aviez probablement besoin, mais en tant qu'opération de dessin, pas en tant qu'opération de compensation. effacer, puis beginPath et dessiner, pas clair et beginPath, puis dessiner. La différence a-t-elle un sens? Regardez ici pour un exemple: w3schools.com/tags/canvas_beginpath.aspD'autres ont déjà fait un excellent travail en répondant à la question mais si une
clear()
méthode simple sur l'objet contextuel vous serait utile (c'était à moi), c'est l'implémentation que j'utilise en fonction des réponses ici:Usage:
la source
context.clearRect ( x , y , w , h );
comme suggéré par @ Pentium10 mais IE9 semble ignorer complètement cette instruction.canvas.width = canvas.width;
mais il n'efface pas les lignes, juste les formes, les images et autres objets à moins que vous n'utilisiez également la solution de @John Allsopp de changer d'abord la largeur.Donc, si vous avez un canevas et un contexte créés comme ceci:
Vous pouvez utiliser une méthode comme celle-ci:
la source
context.clearRect(0,0,context.canvas.width,context.canvas.height)
.function clearCanvas(ctx) { ctx.beginPath(); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); }
Nous sommes en 2018 et il n'y a toujours pas de méthode native pour effacer complètement le canevas pour le redessiner.
clearRect()
n'efface pas complètement la toile. Les dessins de type non remplis ne sont pas effacés (par exemple.rect()
)1.Pour une toile complètement claire quelle que soit la façon dont vous dessinez:
Avantages: préserve strokeStyle, fillStyle, etc.; Pas de décalage;
Inconvénients: inutile si vous utilisez déjà beginPath avant de dessiner quoi que ce soit
2.Utilisation du hack largeur / hauteur:
OU
Pour: Fonctionne avec IE Contre: Réinitialise strokeStyle, fillStyle sur noir; Laggy;
Je me demandais pourquoi une solution native n'existe pas. En fait,
clearRect()
est considéré comme la solution à ligne unique car la plupart des utilisateurs le fontbeginPath()
avant de dessiner un nouveau chemin. Bien que beginPath ne soit utilisé que pour dessiner des lignes et non un chemin fermé commerect().
C'est la raison pour laquelle la réponse acceptée n'a pas résolu mon problème et j'ai fini par perdre des heures à essayer différents hacks. Maudis-tu mozilla
la source
Utilisez la méthode clearRect en passant les coordonnées x, y et la hauteur et la largeur du canevas. ClearRect effacera la toile entière comme:
la source
il y a une tonne de bonnes réponses ici. une autre remarque est que parfois c'est amusant de ne nettoyer que partiellement la toile. c'est-à-dire "effacer" l'image précédente au lieu de l'effacer entièrement. cela peut donner de beaux effets de sentiers.
c'est facile. en supposant que votre couleur de fond est blanche:
la source
Un moyen rapide est de faire
Idk comment ça marche mais ça marche!
la source
C'est ce que j'utilise, quelles que soient les frontières et les transformations matricielles:
Fondamentalement, il enregistre l'état actuel du contexte et dessine un pixel transparent avec
copy
asglobalCompositeOperation
. Restaure ensuite l'état de contexte précédent.la source
Cela a fonctionné pour mon pieChart dans chart.js
la source
J'ai constaté que dans tous les navigateurs que je teste, le moyen le plus rapide est de remplir effectivement le blanc ou la couleur de votre choix. J'ai un très grand moniteur et en mode plein écran, le clearRect est terriblement lent, mais le fillRect est raisonnable.
L'inconvénient est que la toile n'est plus transparente.
la source
dans le webkit, vous devez définir la largeur sur une valeur différente, puis vous pouvez la redéfinir sur la valeur initiale
la source
la source
Un moyen simple mais peu lisible est d'écrire ceci:
la source
J'utilise toujours
la source
remplir le rectangle donné avec des valeurs RGBA:
0 0 0 0: avec Chrome
0 0 0 255: avec FF & Safari
Mais
laissez le rectangle rempli de
0 0 0 255
peu importe le navigateur!
la source
Exemple:
context.clearRect(0, 0, canvas.width, canvas.height);
la source
le chemin le plus court:
la source
moyen le plus rapide:
la source
clearRect
.Si vous utilisez clearRect uniquement, si vous l'avez dans un formulaire pour soumettre votre dessin, vous obtiendrez un envoi à la place de la suppression, ou peut-être qu'il peut d'abord être effacé puis télécharger un dessin nul, vous devrez donc ajouter un preventDefault au début de la fonction:
J'espère que cela aide quelqu'un.
la source
J'utilise toujours ça
REMARQUE
la combinaison de clearRect et requestAnimationFrame permet une animation plus fluide si c'est ce que vous recherchez
la source
Ce sont tous d'excellents exemples de la façon dont vous effacez un canevas standard, mais si vous utilisez paperjs, cela fonctionnera:
Définissez une variable globale en JavaScript:
À partir de votre PaperScript, définissez:
Maintenant, où que vous définissiez clearCanvas sur true, tous les éléments de l'écran seront supprimés.
la source