Estoy trabajando con un elemento de lienzo con una altura de 600
a 1000
píxeles y un ancho de varias decenas o cientos de miles de píxeles. Sin embargo, después de una cierta cantidad de píxeles (obviamente desconocido), el lienzo ya no muestra las formas que dibujo con JS.
¿Alguien sabe si hay un límite?
Probado tanto en Chrome 12 como en Firefox 4.
javascript
html
canvas
serio
fuente
fuente
tens OR hundreds of thousands
...Respuestas:
Actualizado 13/10/2014
Todos los navegadores probados tienen límites en la altura / ancho de los elementos del lienzo, pero muchos navegadores también limitan el área total del elemento del lienzo. Los límites son los siguientes para los navegadores que puedo probar:
Cromo:
Alto / ancho máximo: 32,767 píxeles Área máxima: 268,435,456 píxeles (por ejemplo, 16,384 x 16,384)
Firefox:
Alto / ancho máximo: 32,767 píxeles Área máxima: 472,907,776 píxeles (por ejemplo, 22,528 x 20,992)
ES DECIR:
Alto / ancho máximo: 8.192 píxeles
Área máxima: N / A
IE móvil:
Alto / ancho máximo: 4096 píxeles
Área máxima: N / A
Otro:
No puedo probar otros navegadores en este momento. Consulte las otras respuestas en esta página para conocer los límites adicionales.
Exceder el largo / ancho / área máxima en la mayoría de los navegadores hace que el lienzo sea inutilizable. (Ignorará cualquier comando de dibujo, incluso en el área utilizable). IE e IE Mobile respetarán todos los comandos de dibujo dentro del espacio utilizable.
fuente
<canvas>
elementos apilados y aplicaba automáticamente instrucciones de dibujo al contexto apropiado.Me encontré con errores de falta de memoria en Firefox con alturas de lienzo superiores a 8000, Chrome parece manejar mucho más alto, al menos a 32000.
EDITAR: Después de ejecutar algunas pruebas más, encontré algunos errores muy extraños con Firefox 16.0.2.
Primero, parece que obtengo un comportamiento diferente del lienzo en memoria (creado en javascript) en comparación con el lienzo declarado en html.
En segundo lugar, si no tiene la etiqueta html y el metajuego de caracteres adecuados, el lienzo puede estar restringido a 8196; de lo contrario, puede subir hasta 32767.
En tercer lugar, si obtiene el contexto 2d del lienzo y luego cambia el tamaño del lienzo, es posible que también esté restringido a 8196. Simplemente establecer el tamaño del lienzo antes de tomar el contexto 2d le permite tener hasta 32767 sin errores de memoria.
No he podido obtener los errores de memoria de manera constante, a veces es solo en la carga de la primera página, y luego funcionan los cambios de altura posteriores. Este es el archivo html que estaba probando con http://pastebin.com/zK8nZxdE .
fuente
Tamaño máximo del lienzo de iOS (ancho x alto):
probado en marzo de 2014.
fuente
Para ampliar un poco la respuesta de @FredericCharette: según la guía de contenido de Safari en la sección "Conozca los límites de recursos de iOS":
Por lo tanto, cualquier variación de tamaño de 5242880 (5 x 1024 x 1024) píxeles funcionará en dispositivos de memoria grandes; de lo contrario, son 3145728 píxeles.
Ejemplo de lienzo de 5 megapíxeles (ancho x alto):
y así..
Los lienzos CUADRADOS más grandes son ("MiB" = 1024x1024 Bytes):
fuente
Actualización para 2018:
A medida que avanza el tiempo, las limitaciones de los lienzos han cambiado. Lamentablemente, lo que no ha cambiado es el hecho de que los navegadores aún no brindan información sobre las limitaciones de tamaño del lienzo a través de la API de Canvas.
Para aquellos que buscan determinar mediante programación el tamaño máximo del lienzo del navegador o probar la compatibilidad con dimensiones de lienzo personalizadas, consulte el tamaño del lienzo .
De los documentos:
Un enlace de demostración y los resultados de las pruebas están disponibles en el archivo README , así como una sección de problemas conocidos que trata sobre el rendimiento y las consideraciones de la máquina virtual.
Divulgación completa, soy el autor de la biblioteca. Lo creé en 2014 y recientemente revisé el código para un nuevo proyecto relacionado con el lienzo. Me sorprendió encontrar la misma falta de herramientas disponibles para detectar limitaciones de tamaño de lienzo en 2018, así que actualicé el código, lo publiqué y espero que ayude a otros a encontrar problemas similares.
fuente
De acuerdo con las especificaciones de w3 , la interfaz de ancho / alto es un largo sin firmar, por lo que de 0 a 4,294,967,295 (si recuerdo bien ese número, podría estar fuera de algunos).
EDITAR: Extrañamente, dice unsigned long, pero la prueba muestra solo un valor largo normal como máximo: 2147483647. Jsfiddle - 47 funciona pero hasta 48 y vuelve a los valores predeterminados.
fuente
Aunque el lienzo te permitirá poner altura = 2147483647, cuando comiences a dibujar, no pasará nada
El dibujo ocurre solo cuando devuelvo la altura a 32767
fuente
iOS tiene diferentes límites.
Usando el simulador de iOS 7 pude demostrar que el límite es de 5 MB de esta manera:
pero si levanto el tamaño del lienzo en una sola fila de píxeles:
fuente
En PC
: no creo que haya una restricción, pero sí, puede salir de la excepción de memoria.
En dispositivos móviles:
aquí están las restricciones para el lienzo para dispositivos móviles: -
El tamaño máximo de un elemento de lienzo es de 3 megapíxeles para dispositivos con menos de 256 MB de RAM y 5 megapíxeles para dispositivos con más o igual de 256 MB de RAM.
Entonces, por ejemplo, si desea admitir el hardware más antiguo de Apple, el tamaño de su lienzo no puede exceder los 2048 × 1464.
Espero que estos recursos le ayuden a salir adelante.
fuente
Las limitaciones de Safari (todas las plataformas) son mucho menores.
Limitaciones conocidas de iOS / Safari
Por ejemplo, tenía un búfer de lienzo de 6400x6400px con datos dibujados en él. Al rastrear / exportar el contenido y al probar en otros navegadores, pude ver que todo estaba bien. Pero en Safari, omitiría el dibujo de este búfer específico en mi contexto principal.
fuente
Traté de averiguar el límite mediante programación: estableciendo el tamaño del lienzo a partir de 35000, reduciendo en 100 hasta que se encuentre un tamaño válido. En cada paso, escriba el píxel inferior derecho y luego lo lea. Funciona con precaución.
La velocidad es aceptable si cualquiera de anchura o altura se establece en un valor bajo (por ejemplo 10-200.) De esta manera:
get_max_canvas_size('height', 20)
.Pero si se llama sin ancho o alto
get_max_canvas_size()
, el lienzo creado es tan grande que leer el color de UN SOLO píxel es muy lento y, en IE, se bloquea gravemente.Si esta prueba similar se pudiera realizar de alguna manera sin leer el valor de los píxeles, la velocidad sería aceptable.
Por supuesto, la forma más fácil de detectar el tamaño máximo sería alguna forma nativa de consultar el ancho y la altura máximos. Pero Canvas es 'un estándar de vida', por lo que puede que llegue algún día.
http://jsfiddle.net/timo2012/tcg6363r/2/ (¡Tenga en cuenta que su navegador puede bloquearse!)
fuente
Cuando utiliza lienzos WebGL, los navegadores (incluidos los de escritorio) impondrán límites adicionales en el tamaño del búfer subyacente. Incluso si su lienzo es grande, por ejemplo, 16 000 x 16 000, la mayoría de los navegadores generarán una imagen más pequeña (digamos 4096 x 4096) y la ampliarán. Eso podría causar un pixelado feo, etc.
He escrito un código para determinar ese tamaño máximo usando una búsqueda exponencial, si alguien lo necesita.
determineMaxCanvasSize()
es la función que le interesa.También en un jsfiddle https://jsfiddle.net/1sh47wfk/1/
fuente
Puede dividirlo y en javascript agregar automáticamente tantos lienzos más pequeños como sea necesario y dibujar los elementos en el lienzo apropiado. Es posible que aún se quede sin memoria eventualmente, pero llegará al límite de un solo lienzo.
fuente
No sé cómo detectar el tamaño máximo posible sin alteración, pero puede detectar si un tamaño de lienzo determinado funciona rellenando un píxel y luego leyendo el color de nuevo. Si el lienzo no se ha renderizado, el color que obtenga no coincidirá. W
código parcial:
fuente