So löschen Sie den Canvas für das Neuzeichnen
Nachdem das Experimentieren mit composite-Operationen und zeichnen von Bildern auf der Leinwand ich bin jetzt versuchen, entfernen Sie Bilder und compositing. Wie mache ich das?
Muss ich deaktivieren Sie die Leinwand für Neuzeichnen andere Bilder; diese können gehen für eine Weile, also ich glaube nicht, dass das zeichnen eines neuen Rechtecks, jedes mal wird die effizienteste option.
InformationsquelleAutor der Frage richard | 2010-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort Pentium10
Verwenden:
context.clearRect(0, 0, canvas.width, canvas.height);
Dies ist die Schnellste und die meisten beschreibenden Weg zum löschen der gesamten Leinwand.
Nicht verwenden:
canvas.width = canvas.width;
Zurücksetzen
canvas.width
setzt alle Leinwand-Staat (z.B. Transformationen, lineWidth, strokeStyle, etc.), es ist sehr langsam (im Vergleich zu clearRect), es funktioniert nicht in allen Browsern, und es nicht beschreiben, was du eigentlich machen willst.Umgang mit transformierten Koordinaten
Wenn Sie geändert haben die Transformations-matrix (z.B. mit
scale
rotate
odertranslate
) danncontext.clearRect(0,0,canvas.width,canvas.height)
wird wahrscheinlich nicht klar, dass das gesamte sichtbare Bereich der Leinwand.Die Lösung? Zurücksetzen der transformation matrix vor der leeren Leinwand:
Edit:
Ich habe nur getan, einige Profilerstellung und (in Chrome) ist es über 10% deutlich schneller auf einer 300x150 (Standard-Größe) Leinwand ohne zurücksetzen der Transformation. Die Größe der Leinwand erhöht sich dieser Unterschied fällt.
Dass ist schon relativ klein, aber in den meisten Fällen wird die Zeichnung wesentlich mehr, als Sie klärt, und ich glaube, dieser performance-Unterschied irrelevant.
InformationsquelleAutor der Antwort Prestaul
Wenn Sie Linien zeichnen, stellen Sie sicher, vergessen Sie nicht:
Sonst die Linien nicht erhalten, gelöscht.
InformationsquelleAutor der Antwort trembl
Andere bereits getan haben eine ausgezeichnete Arbeit der Beantwortung der Frage aber, ob eine einfache
clear()
Methode auf dem Kontext-Objekt wäre nützlich für Sie (es war für mich), dies ist die Implementierung, die ich verwenden, basieren auf den Antworten hier:Verwendung:
InformationsquelleAutor der Antwort JonathanK
context.clearRect ( x , y , w , h );
wie vorgeschlagen von @Pentium10 aber IE9 scheint komplett zu ignorieren diese Anweisung.canvas.width = canvas.width;
es heißt aber nicht, klare Linien, gerade Formen, Bilder und andere Objekte, es sei denn, Sie verwenden auch @John Allsopp ' s-Lösung der ersten änderung der Breite.Also, wenn Sie eine Leinwand und Rahmen wie folgt erstellt:
Können Sie eine Methode wie diese:
InformationsquelleAutor der Antwort grenade
Verwenden clearRect-Methode durch übergabe der x,y-Koordinaten sowie Höhe und Breite der Leinwand. ClearRect löscht ganze Leinwand als :
InformationsquelleAutor der Antwort Vishwas
es gibt eine Menge gute Antworten hier.
eine weitere Anmerkung ist, dass es manchmal Spaß macht, nur teilweise deaktivieren Sie die Leinwand.
das heißt, "fade out" aus dem vorherigen Bild, anstatt das löschen es völlig.
dies kann Ihnen schöne Wanderwege Effekte.
ist es einfach. angenommen, Ihre hintergrund-Farbe ist weiß:
InformationsquelleAutor der Antwort orion elenzil
in webkit, die Sie brauchen, um stellen Sie die Breite auf einen anderen Wert, dann können Sie es wieder auf den ursprünglichen Wert
InformationsquelleAutor der Antwort John Allsopp
Habe ich festgestellt, dass in allen Browsern Teste ich, der Schnellste Weg ist, um tatsächlich fillRect mit weiß, oder whataever Farbe, die Sie möchten. Ich habe einen sehr großen monitor und in full-screen-Modus die clearRect ist quälend langsam, aber fillRect zumutbar ist.
Der Nachteil ist, dass die Leinwand ist nicht mehr transparent.
InformationsquelleAutor der Antwort John Page
InformationsquelleAutor der Antwort Imagine Breaker
Dieser arbeitete für meine pieChart in chart.js
InformationsquelleAutor der Antwort Sanal S
Schnellste Weg:
InformationsquelleAutor der Antwort elser
Einen schnellen Weg, zu tun ist,
Idk, wie es funktioniert, aber es funktioniert!
InformationsquelleAutor der Antwort Jacob Morris
Dies ist 2018 und immer noch gibt es keine native Methode, um vollständig zu löschen die Leinwand für das Neuzeichnen.
clearRect()
hat nicht klar, die Leinwand komplett. Nicht-fill type Zeichnungen sind nicht gelöscht (zB.rect()
)1.Zu komplett klar canvas-unabhängig davon, wie Sie zu zeichnen:
Vorteile: Bewahrt strokeStyle, fillStyle, etc.; Keine Verzögerung;
Nachteile: Unnötig, wenn Sie bereits mit beginPath vor dem auftragen etwas
2.Mit dem Breite/Höhe-hack:
ODER
Vorteile: Funktioniert mit IE
Nachteile: Setzt strokeStyle, fillStyle, schwarz; Laggt;
Ich Frage mich, warum eine native Lösung nicht vorhanden ist. Eigentlich
clearRect()
ist als die single-line-Lösung, weil die meisten Benutzer tunbeginPath()
vor dem zeichnen irgendwelche neuen Weg. Obwohl beginPath nur verwendet werden, beim zeichnen von Linien und nicht geschlossenen Pfad wierect().
Dies ist der Grund, warum die akzeptierte Antwort hat mein problem nicht lösen und ich landete verschwenden Stunden versucht verschiedene hacks. Fluch Sie mozilla
InformationsquelleAutor der Antwort sziraqui
Einer einfachen, aber nicht sehr lesbaren Art und Weise ist, dies zu schreiben:
InformationsquelleAutor der Antwort Chang
Dies ist, was ich verwenden, unabhängig von Grenzen und matrix-Transformationen:
Grundsätzlich, speichert es den aktuellen Zustand des Kontext, und zieht eine transparente pixel mit
copy
alsglobalCompositeOperation
. Dann stellt die bisherigen Kontext Staat.InformationsquelleAutor der Antwort superruzafa
Diese sind alle großartige Beispiele dafür, wie Sie klar eine standard-Leinwand, aber wenn Sie mit paperjs, dann funktioniert das:
Definieren Sie eine Globale variable in JavaScript:
Von Ihrem PaperScript definieren:
Nun, wo legen Sie clearCanvas zu wahren, wird es deaktivieren Sie alle Elemente aus dem Bildschirm.
InformationsquelleAutor der Antwort Robert Ogle
füllen Sie das gegebene Rechteck mit RGBA-Werte :
0 0 0 0 : mit Chrome
0 0 0 255 : mit FF & Safari
Aber
lassen Sie das Rechteck gefüllt mit
0 0 0 255
egal, die browser !
InformationsquelleAutor der Antwort Philippe Oceangermanique
Wenn Sie clearRect nur, wenn du es in einer form einzureichen, die Ihre Zeichnung bekommen Sie eine senden-stattdessen die Lichtung, oder vielleicht kann es gelöscht werden, erste und laden Sie dann eine leere Zeichnung, so müssen Sie eine preventDefault am Anfang der Funktion:
Hoffe, es hilft jemand.
InformationsquelleAutor der Antwort JoelBonetR
Beispiel:
context.clearRect(0, 0, canvas.width, canvas.height);
InformationsquelleAutor der Antwort Gavin T