Setelah bereksperimen dengan operasi komposit dan menggambar gambar pada kanvas saya sekarang mencoba untuk menghapus gambar dan pengomposisian. Bagaimana saya melakukan ini?
Saya perlu membersihkan kanvas untuk menggambar ulang gambar lain; ini bisa berlangsung sebentar jadi saya tidak berpikir menggambar persegi panjang baru setiap kali akan menjadi pilihan yang paling efisien.
javascript
html
canvas
html5-canvas
composite
richard
sumber
sumber
clearRect
Anda harus memiliki konteks yang tidak diubah, atau melacak batasan Anda yang sebenarnya.context.clearRect(0, 0, context.canvas.width, context.canvas.height)
. Secara efektif hal yang sama tetapi satu ketergantungan kurang (1 variabel, bukan 2)Menggunakan:
context.clearRect(0, 0, canvas.width, canvas.height);
Ini adalah cara tercepat dan paling deskriptif untuk menghapus seluruh kanvas.
Jangan gunakan:
canvas.width = canvas.width;
Menyetel
canvas.width
ulang semua keadaan kanvas (mis. Transformasi, lineWidth, strokeStyle, dll.), Ini sangat lambat (dibandingkan dengan clearRect), itu tidak berfungsi di semua browser, dan itu tidak menggambarkan apa yang sebenarnya Anda coba lakukan.Berurusan dengan koordinat yang diubah
Jika Anda telah memodifikasi matriks transformasi (misalnya menggunakan
scale
,rotate
atautranslate
) makacontext.clearRect(0,0,canvas.width,canvas.height)
kemungkinan besar tidak akan menghapus seluruh bagian terlihat dari kanvas.Solusinya? Setel ulang matriks transformasi sebelum membersihkan kanvas:
Sunting: Saya baru saja melakukan beberapa profil dan (di Chrome) sekitar 10% lebih cepat untuk menghapus kanvas 300x150 (ukuran standar) tanpa mengatur ulang transformasi. Ketika ukuran kanvas Anda meningkat, perbedaan ini menurun.
Itu sudah relatif tidak signifikan, tetapi dalam banyak kasus Anda akan menggambar jauh lebih banyak daripada yang Anda kliring dan saya percaya perbedaan kinerja ini tidak relevan.
sumber
canvas
variabel lokal dengan menggunakanctx.canvas
sebagai gantinya.canvas.width
dancanvas.height
ketika membersihkan. Saya belum melakukan analisis numerik pada perbedaan runtime dibandingkan dengan mengatur ulang transformasi, tapi saya menduga itu akan menghasilkan kinerja yang sedikit lebih baik.Jika Anda menggambar garis, pastikan Anda tidak lupa:
Kalau tidak, garis tidak akan dihapus.
sumber
beginPath
ketika Anda memulai jalan baru , jangan menganggap itu hanya karena Anda sedang membersihkan kanvas yang ingin Anda hapus jalur yang ada juga! Ini akan menjadi praktik yang mengerikan dan merupakan cara mundur untuk melihat gambar.beginPath
tidak menghapus apa pun dari kanvas Anda, itu me-reset path sehingga entri path sebelumnya dihapus sebelum Anda menggambar. Anda mungkin memang membutuhkannya, tetapi sebagai operasi menggambar, bukan operasi kliring. jelas, lalu beginPath dan gambar, tidak jelas dan beginPath, lalu gambar. Apakah perbedaan itu masuk akal? Lihat di sini untuk contoh: w3schools.com/tags/canvas_beginpath.aspOrang lain telah melakukan pekerjaan yang sangat baik untuk menjawab pertanyaan, tetapi jika
clear()
metode sederhana pada objek konteks akan berguna bagi Anda (bagi saya), ini adalah implementasi yang saya gunakan berdasarkan jawaban di sini:Pemakaian:
sumber
context.clearRect ( x , y , w , h );
seperti yang disarankan oleh @ Pentium10 tetapi IE9 tampaknya sepenuhnya mengabaikan instruksi ini.canvas.width = canvas.width;
tetapi tidak menghapus garis, hanya bentuk, gambar, dan objek lain kecuali Anda juga menggunakan solusi @John Allsopp untuk pertama-tama mengubah lebar.Jadi jika Anda memiliki kanvas dan konteks yang dibuat seperti ini:
Anda dapat menggunakan metode seperti ini:
sumber
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); }
Ini adalah 2018 dan masih belum ada metode asli untuk menghapus kanvas sepenuhnya untuk menggambar ulang.
clearRect()
tidak membersihkan kanvas sepenuhnya. Gambar jenis non-isi tidak dihapus (mis.rect()
)1. Untuk menghapus kanvas sepenuhnya terlepas dari cara Anda menggambar:
Pro: Mempertahankan strokeStyle, fillStyle dll; Tidak ketinggalan;
Cons: Tidak perlu jika Anda sudah menggunakan beginPath sebelum menggambar apa pun
2.Menggunakan hack lebar / tinggi:
ATAU
Pro: Bekerja dengan IE Cons: Mereset strokeStyle, fillStyle menjadi hitam; Laggy;
Saya bertanya-tanya mengapa solusi asli tidak ada. Sebenarnya,
clearRect()
dianggap sebagai solusi garis tunggal karena sebagian besar pengguna lakukanbeginPath()
sebelum menggambar jalur baru. Padahal beginPath hanya digunakan saat menggambar garis dan bukan jalan tertutup sepertirect().
Ini adalah alasan mengapa jawaban yang diterima tidak menyelesaikan masalah saya dan saya akhirnya menghabiskan waktu berjam-jam untuk mencoba hack yang berbeda. Terkutuklah kamu mozilla
sumber
Gunakan metode clearRect dengan melewatkan koordinat x, y dan tinggi serta lebar kanvas. ClearRect akan menghapus seluruh kanvas sebagai:
sumber
ada banyak jawaban bagus di sini. satu catatan lebih lanjut adalah bahwa kadang-kadang menyenangkan hanya membersihkan sebagian kanvas. yaitu, "fade out" gambar sebelumnya alih-alih menghapusnya seluruhnya. ini dapat memberikan efek jejak yang bagus.
mudah. seandainya warna latar belakang Anda putih:
sumber
Cara cepat adalah melakukan
Idk cara kerjanya tetapi itu!
sumber
Inilah yang saya gunakan, terlepas dari batasan dan transformasi matriks:
Pada dasarnya, ini menyimpan keadaan konteks saat ini, dan menggambar piksel transparan dengan
copy
asglobalCompositeOperation
. Kemudian, pulihkan keadaan konteks sebelumnya.sumber
Ini berfungsi untuk pieChart saya di chart.js
sumber
Saya telah menemukan bahwa di semua browser yang saya uji, cara tercepat adalah dengan benar-benar mengisiRect dengan warna putih, atau warna apa pun yang Anda inginkan. Saya memiliki monitor yang sangat besar dan dalam mode layar penuh clearRect sangat lambat, tetapi fillRect masuk akal.
Kekurangannya adalah bahwa kanvas tidak lagi transparan.
sumber
di webkit Anda perlu mengatur lebar ke nilai yang berbeda, maka Anda dapat mengaturnya kembali ke nilai awal
sumber
sumber
Cara sederhana, tetapi tidak terlalu mudah dibaca adalah menulis ini:
sumber
Saya selalu menggunakan
sumber
isi kotak yang diberikan dengan nilai RGBA:
0 0 0 0: dengan Chrome
0 0 0 255: dengan FF & Safari
Tapi
biarkan persegi panjang diisi dengan
0 0 0 255
tidak masalah browser!
sumber
Contoh:
context.clearRect(0, 0, canvas.width, canvas.height);
sumber
cara terpendek:
sumber
jalan tercepat:
sumber
clearRect
.Jika Anda menggunakan clearRect saja, jika Anda memilikinya dalam bentuk untuk mengirimkan gambar Anda, Anda akan mendapatkan kiriman sebagai gantinya, atau mungkin itu dapat dihapus terlebih dahulu dan kemudian mengunggah gambar batal, jadi Anda harus menambahkan preventDefault pada awal fungsi:
Semoga ini bisa membantu seseorang.
sumber
Saya selalu menggunakan ini
CATATAN
menggabungkan clearRect dan requestAnimationFrame memungkinkan animasi yang lebih lancar jika Anda menginginkannya
sumber
Ini semua adalah contoh yang bagus tentang bagaimana Anda menghapus kanvas standar, tetapi jika Anda menggunakan paperjs, maka ini akan berhasil:
Tentukan variabel global dalam JavaScript:
Dari PaperScript Anda tentukan:
Sekarang di mana pun Anda mengatur clearCanvas menjadi true, itu akan menghapus semua item dari layar.
sumber