Po eksperymentowaniu z operacjami złożonymi i rysowaniu obrazów na płótnie próbuję teraz usunąć obrazy i kompozycję. Jak mam to zrobic?
Muszę wyczyścić płótno, aby przerysować inne obrazy; to może trwać przez jakiś czas, więc nie sądzę, aby rysowanie nowego prostokąta za każdym razem było najbardziej wydajną opcją.
javascript
html
canvas
html5-canvas
composite
Richard
źródło
źródło
clearRect
że musisz mieć nieprzetworzony kontekst lub śledzić swoje rzeczywiste granice.context.clearRect(0, 0, context.canvas.width, context.canvas.height)
. Jest to właściwie to samo, ale jedna mniejsza zależność (1 zmienna zamiast 2)Posługiwać się:
context.clearRect(0, 0, canvas.width, canvas.height);
Jest to najszybszy i najbardziej opisowy sposób na wyczyszczenie całego obszaru roboczego.
Nie używaj:
canvas.width = canvas.width;
Resetowanie
canvas.width
resetuje cały stan obszaru roboczego (np. Transformacje, lineWidth, strokeStyle itp.), Jest bardzo wolny (w porównaniu do clearRect), nie działa we wszystkich przeglądarkach i nie opisuje tego, co tak naprawdę próbujesz zrobić.Radzenie sobie z transformowanymi współrzędnymi
Jeśli zmodyfikowałeś macierz transformacji (np. Używając
scale
,rotate
lubtranslate
)context.clearRect(0,0,canvas.width,canvas.height)
, prawdopodobnie nie wyczyści całej widocznej części obszaru roboczego.Rozwiązanie? Zresetuj macierz transformacji przed wyczyszczeniem kanwy:
Edycja: Właśnie przeprowadziłem profilowanie i (w Chrome) jest około 10% szybsze wyczyszczenie obszaru roboczego 300 x 150 (domyślny rozmiar) bez resetowania transformacji. Wraz ze wzrostem rozmiaru płótna różnica ta spada.
Jest to już stosunkowo mało znaczące, ale w większości przypadków będziesz rysować znacznie więcej niż to, co robisz, i uważam, że ta różnica w wydajności nie ma znaczenia.
źródło
canvas
zmiennej lokalnej , używającctx.canvas
zamiast tego.canvas.width
icanvas.height
po polanie. Nie wykonałem żadnej analizy numerycznej różnicy czasu wykonywania w porównaniu do zresetowania transformacji, ale podejrzewam, że przyniosłoby to nieco lepszą wydajność.Jeśli rysujesz linie, pamiętaj, aby nie zapomnieć:
W przeciwnym razie linie nie zostaną usunięte.
źródło
beginPath
kiedy zaczynasz nową ścieżkę , nie zakładaj tego tylko dlatego, że czyścisz płótno, które chcesz wyczyścić również istniejącą ścieżkę! Byłaby to okropna praktyka i jest odwróconym spojrzeniem na rysunek.beginPath
nie usuwa niczego z obszaru roboczego, resetuje ścieżkę, dzięki czemu poprzednie wpisy ścieżki są usuwane przed rysowaniem. Prawdopodobnie potrzebujesz go, ale jako operacji rysowania, a nie operacji czyszczenia. wyczyść, następnie rozpocznij Ścieżkę i narysuj, nie wyczyść i rozpocznij Ścieżkę, a następnie narysuj. Czy różnica ma sens? Spójrz tutaj na przykład: w3schools.com/tags/canvas_beginpath.aspInni już wykonali świetną robotę, odpowiadając na pytanie, ale jeśli prosta
clear()
metoda na obiekcie kontekstowym byłaby dla ciebie przydatna (to było dla mnie), jest to implementacja, której używam na podstawie odpowiedzi tutaj:Stosowanie:
źródło
context.clearRect ( x , y , w , h );
jak sugeruje @ Pentium10, ale IE9 wydaje się całkowicie ignorować tę instrukcję.canvas.width = canvas.width;
ale nie usuwa linii, tylko kształty, obrazy i inne obiekty, chyba że użyjesz rozwiązania @John Allsopp, polegającego na zmianie szerokości.Więc jeśli masz kanwę i kontekst utworzone w ten sposób:
Możesz użyć metody takiej jak ta:
źródło
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); }
Jest rok 2018 i nadal nie ma natywnej metody całkowitego wyczyszczenia obszaru roboczego do przerysowania.
clearRect()
nie usuwa całkowicie płótna. Rysunki typu niepełniącego nie są usuwane (np.rect()
)1. Aby całkowicie wyczyścić płótno, niezależnie od sposobu rysowania:
Zalety: Zachowuje styl udarowy, styl wypełnienia itp .; Bez opóźnień;
Minusy: niepotrzebne, jeśli już korzystasz z beginPath przed rysowaniem czegokolwiek
2. Za pomocą hacka szerokości / wysokości:
LUB
Plusy: Współpracuje z IE Cons: Resetuje strokeStyle, fillStyle na czarny; Laggy;
Zastanawiałem się, dlaczego natywne rozwiązanie nie istnieje. W rzeczywistości
clearRect()
jest uważany za rozwiązanie jednowierszowe, ponieważ większość użytkowników robi tobeginPath()
przed narysowaniem nowej ścieżki. Chociaż beginPath może być używany tylko podczas rysowania linii, a nie zamkniętej ścieżki jakrect().
To jest powód, dla którego zaakceptowana odpowiedź nie rozwiązała mojego problemu i skończyłem marnowaniem godzin na próby różnych hacków. Przeklnij mozillę
źródło
Użyj metody clearRect, przekazując współrzędne x, y oraz wysokość i szerokość płótna. ClearRect wyczyści całe płótno jako:
źródło
jest tu mnóstwo dobrych odpowiedzi. jedna dodatkowa uwaga jest taka, że czasami fajnie jest tylko częściowo wyczyścić płótno. to znaczy „wyciemnia” poprzedni obraz zamiast go całkowicie wymazać. może to dać ładne efekty szlaków.
To jest łatwe. zakładając, że kolor tła jest biały:
źródło
Szybki sposób to zrobić
Idk jak to działa, ale działa!
źródło
Oto, czego używam, bez względu na granice i transformacje macierzy:
Zasadniczo zapisuje bieżący stan kontekstu i rysuje przezroczysty piksel za pomocą
copy
asglobalCompositeOperation
. Następnie przywraca poprzedni stan kontekstu.źródło
To zadziałało dla mojego pieChart w chart.js
źródło
Zauważyłem, że we wszystkich testowanych przeglądarkach najszybszym sposobem jest wypełnienie Rect białym lub innym kolorem, który chcesz. Mam bardzo duży monitor iw trybie pełnoekranowym clearRect działa agonalnie wolno, ale fillRect jest rozsądny.
Wadą jest to, że płótno nie jest już przezroczyste.
źródło
w webkicie musisz ustawić szerokość na inną wartość, a następnie możesz ustawić ją z powrotem na wartość początkową
źródło
źródło
Prostym, ale niezbyt czytelnym sposobem jest napisanie tego:
źródło
Zawsze używam
źródło
wypełnij podany prostokąt wartościami RGBA:
0 0 0 0: z Chrome
0 0 0 255: z FF i Safari
Ale
niech prostokąt wypełni się
0 0 0 255
bez względu na przeglądarkę!
źródło
Przykład:
context.clearRect(0, 0, canvas.width, canvas.height);
źródło
najkrótsza droga:
źródło
najszybsza droga:
źródło
clearRect
.Jeśli użyjesz tylko clearRect, jeśli masz go w formularzu, aby przesłać rysunek, zamiast tego otrzymasz przesłanie, a może najpierw możesz je wyczyścić, a następnie przesłać nieważny rysunek, więc musisz dodać preventDefault na początku funkcji:
Mam nadzieję, że to komuś pomoże.
źródło
Zawsze tego używam
UWAGA
Łączenie clearRect i requestAnimationFrame pozwala na płynniejszą animację, jeśli właśnie o to chodzi
źródło
Są to świetne przykłady tego, jak wyczyścić standardowe płótno, ale jeśli używasz paperjs, to zadziała:
Zdefiniuj zmienną globalną w JavaScript:
Ze swojego PaperScript zdefiniuj:
Teraz, gdziekolwiek ustawisz clearCanvas na true, usunie wszystkie elementy z ekranu.
źródło