Después de experimentar con operaciones compuestas y dibujar imágenes en el lienzo, ahora estoy tratando de eliminar imágenes y componer. ¿Cómo hago esto?
Necesito limpiar el lienzo para volver a dibujar otras imágenes; esto puede continuar por un tiempo, así que no creo que dibujar un nuevo rectángulo cada vez sea la opción más eficiente.
javascript
html
canvas
html5-canvas
composite
Ricardo
fuente
fuente
clearRect
debe tener un contexto no transformado o realizar un seguimiento de sus límites reales.context.clearRect(0, 0, context.canvas.width, context.canvas.height)
. Efectivamente es lo mismo pero una dependencia menos (1 variable en lugar de 2)Utilizar:
context.clearRect(0, 0, canvas.width, canvas.height);
Esta es la forma más rápida y descriptiva de borrar todo el lienzo.
No utilice:
canvas.width = canvas.width;
El restablecimiento
canvas.width
restablece todos los estados del lienzo (por ejemplo, transformaciones, ancho de línea, estilo de trazo, etc.), es muy lento (en comparación con clearRect), no funciona en todos los navegadores y no describe lo que realmente está intentando hacer.Manejo de coordenadas transformadas
Si ha modificado la matriz de transformación (por ejemplo
scale
, usando ,rotate
otranslate
), entoncescontext.clearRect(0,0,canvas.width,canvas.height)
probablemente no borrará toda la parte visible del lienzo.¿La solución? Restablezca la matriz de transformación antes de limpiar el lienzo:
Editar: Acabo de hacer algunos perfiles y (en Chrome) es aproximadamente un 10% más rápido borrar un lienzo de 300x150 (tamaño predeterminado) sin restablecer la transformación. A medida que aumenta el tamaño de su lienzo, esta diferencia disminuye.
Eso ya es relativamente insignificante, pero en la mayoría de los casos obtendrá mucho más de lo que está limpiando y creo que esta diferencia de rendimiento es irrelevante.
fuente
canvas
variable local utilizando en suctx.canvas
lugar.canvas.width
ycanvas.height
al borrarlas. No he hecho ningún análisis numérico sobre la diferencia de tiempo de ejecución en comparación con el restablecimiento de la transformación, pero sospecho que obtendría un rendimiento un poco mejor.Si está dibujando líneas, asegúrese de no olvidar:
De lo contrario, las líneas no se despejarán.
fuente
beginPath
cuando comiences un nuevo camino , no asumas eso solo porque están limpiando el lienzo que desea borrar su ruta existente también! Esta sería una práctica horrible y es una forma inversa de mirar el dibujo.beginPath
no borra nada de su lienzo, restablece la ruta para que las entradas de ruta anteriores se eliminen antes de dibujar. Probablemente lo necesitaba, pero como operación de dibujo, no como una operación de limpieza. borrar, luego comenzar Ruta y dibujar, no borrar y comenzar Ruta, luego dibujar. ¿Tiene sentido la diferencia? Mire aquí para ver un ejemplo: w3schools.com/tags/canvas_beginpath.aspOtros ya han hecho un excelente trabajo respondiendo la pregunta, pero si un
clear()
método simple en el objeto de contexto fuera útil para usted (lo fue para mí), esta es la implementación que uso en base a las respuestas aquí:Uso:
fuente
context.clearRect ( x , y , w , h );
como lo sugiere @ Pentium10, pero IE9 parece ignorar por completo esta instrucción.canvas.width = canvas.width;
pero no borra líneas, solo formas, imágenes y otros objetos a menos que también use la solución de @John Allsopp de cambiar primero el ancho.Entonces, si tiene un lienzo y un contexto creados así:
Puedes usar un método como este:
fuente
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); }
Esto es 2018 y aún no existe un método nativo para borrar completamente el lienzo para volver a dibujar.
clearRect()
No borra el lienzo por completo. Los dibujos de tipo sin relleno no se borran (p. Ej.rect()
)1.Para limpiar completamente el lienzo, independientemente de cómo dibuje:
Pros: conserva el estilo de trazo, el estilo de relleno, etc .; Sin retraso;
Contras: innecesario si ya está utilizando beginPath antes de dibujar cualquier cosa
2.Utilizando el ancho / alto hack:
O
Pros: Funciona con IE Contras: Restablece strokeStyle, fillStyle a negro; Laggy;
Me preguntaba por qué no existe una solución nativa. En realidad,
clearRect()
se considera como la solución de línea única porque la mayoría de los usuarios lo hacenbeginPath()
antes de dibujar cualquier ruta nueva. Aunque beginPath solo se debe usar al dibujar líneas y no en rutas cerradas comorect().
Esta es la razón por la cual la respuesta aceptada no resolvió mi problema y terminé perdiendo horas probando diferentes hacks. Te maldigo mozilla
fuente
Use el método clearRect pasando coordenadas x, y, altura y ancho del lienzo. ClearRect borrará todo el lienzo como:
fuente
Hay un montón de buenas respuestas aquí. Una nota adicional es que a veces es divertido borrar solo parcialmente el lienzo. es decir, "desvanece" la imagen anterior en lugar de borrarla por completo. Esto puede dar buenos efectos de senderos.
es fácil. suponiendo que el color de fondo sea blanco:
fuente
Una forma rápida es hacer
¡No sé cómo funciona, pero lo hace!
fuente
Esto es lo que uso, independientemente de los límites y las transformaciones matriciales:
Básicamente, guarda el estado actual del contexto y dibuja un píxel transparente con
copy
asglobalCompositeOperation
. Luego, restaura el estado del contexto anterior.fuente
Esto funcionó para mi pieChart en chart.js
fuente
He descubierto que en todos los navegadores que pruebo, la forma más rápida es llenar Rect con blanco o con el color que desee. Tengo un monitor muy grande y en modo de pantalla completa clearRect es extremadamente lento, pero fillRect es razonable.
El inconveniente es que el lienzo ya no es transparente.
fuente
en webkit necesita establecer el ancho en un valor diferente, luego puede volver a establecerlo en el valor inicial
fuente
fuente
Una manera simple, pero no muy legible es escribir esto:
fuente
Yo siempre uso
fuente
rellena el rectángulo dado con valores RGBA:
0 0 0 0: con Chrome
0 0 0 255: con FF y Safari
Pero
deje que el rectángulo se llene con
0 0 0 255
sin importar el navegador!
fuente
Ejemplo:
context.clearRect(0, 0, canvas.width, canvas.height);
fuente
El camino más corto:
fuente
la manera más rápida:
fuente
clearRect
.Si usa clearRect solo, si lo tiene en un formulario para enviar su dibujo, recibirá un envío en lugar del borrado, o tal vez pueda borrarse primero y luego cargar un dibujo vacío, por lo que deberá agregar un preventDefault al comienzo de la función:
Espero que ayude a alguien.
fuente
Siempre uso esto
NOTA
la combinación de clearRect y requestAnimationFrame permite una animación más fluida si eso es lo que está buscando
fuente
Todos estos son excelentes ejemplos de cómo limpiar un lienzo estándar, pero si está utilizando paperjs, entonces esto funcionará:
Defina una variable global en JavaScript:
De su PaperScript defina:
Ahora, donde establezca clearCanvas en true, borrará todos los elementos de la pantalla.
fuente