Je travaille avec un élément canvas d'une hauteur de 600
à 1000
pixels et d'une largeur de plusieurs dizaines ou centaines de milliers de pixels. Cependant, après un certain nombre de pixels (évidemment inconnu), le canevas n'affiche plus les formes que je dessine avec JS.
Est-ce que quelqu'un sait s'il y a une limite?
Testé à la fois dans Chrome 12 et Firefox 4.
javascript
html
canvas
seriousdev
la source
la source
tens OR hundreds of thousands
...Réponses:
Mis à jour le 13/10/2014
Tous les navigateurs testés ont des limites à la hauteur / largeur des éléments de canevas, mais de nombreux navigateurs limitent également la surface totale de l'élément de canevas. Les limites sont les suivantes pour les navigateurs que je peux tester:
Chrome:
Hauteur / largeur maximale: 32 767 pixels
Zone maximale: 268 435 456 pixels (par exemple, 16 384 x 16 384)
Firefox:
Hauteur / largeur maximale: 32 767 pixels
Zone maximale: 472 907 776 pixels (par exemple, 22 528 x 20 992)
C'EST À DIRE:
Hauteur / largeur maximale: 8192 pixels
Zone maximale: N / A
Mobile IE:
Hauteur / largeur maximale: 4096 pixels
Zone maximale: N / A
Autre:
Je ne peux pas tester d'autres navigateurs pour le moment. Reportez-vous aux autres réponses sur cette page pour connaître les limites supplémentaires.
Le dépassement de la longueur / largeur / zone maximale sur la plupart des navigateurs rend le canevas inutilisable. (Il ignorera toutes les commandes de dessin, même dans la zone utilisable.) IE et IE Mobile honoreront toutes les commandes de dessin dans l'espace utilisable.
la source
<canvas>
éléments empilés et appliquait automatiquement les instructions de dessin au contexte approprié.J'ai rencontré des erreurs de mémoire sur Firefox avec des hauteurs de canevas supérieures à 8000, le chrome semble gérer beaucoup plus haut, au moins jusqu'à 32000.
EDIT: Après avoir exécuté quelques tests supplémentaires, j'ai trouvé des erreurs très étranges avec Firefox 16.0.2.
Premièrement, je semble avoir un comportement différent du canevas en mémoire (créé en javascript) par opposition au canevas déclaré html.
Deuxièmement, si vous n'avez pas la balise html et le jeu de caractères méta appropriés, le canevas peut être limité à 8196, sinon vous pouvez aller jusqu'à 32767.
Troisièmement, si vous obtenez le contexte 2D du canevas et que vous modifiez ensuite la taille du canevas, vous pourriez également être limité à 8196. Le simple fait de définir la taille du canevas avant de saisir le contexte 2d vous permet d'avoir jusqu'à 32767 sans avoir d'erreurs de mémoire.
Je n'ai pas pu obtenir systématiquement les erreurs de mémoire, parfois ce n'est que lors du chargement de la première page, puis les changements de hauteur ultérieurs fonctionnent. C'est le fichier html que je testais avec http://pastebin.com/zK8nZxdE .
la source
Taille maximale du canevas iOS (largeur x hauteur):
testé en mars 2014.
la source
Pour développer un peu la réponse @FredericCharette: Selon le guide de contenu de safari dans la section "Connaître les limites des ressources iOS":
Par conséquent, toute variation de taille de 5242880 (5 x 1024 x 1024) pixels fonctionnera sur les grands périphériques de mémoire, sinon il s'agit de 3145728 pixels.
Exemple pour un canevas 5 mégapixels (largeur x hauteur):
etc..
Les plus grandes toiles SQUARE sont ("Mio" = 1024x1024 octets):
la source
Mise à jour pour 2018:
Au fil du temps, les limitations de la toile ont changé. Malheureusement, ce qui n'a pas changé, c'est le fait que le navigateur ne fournit toujours pas d'informations sur les limitations de taille du canevas via l'API Canvas.
Pour ceux qui cherchent à déterminer par programme la taille maximale du canevas du navigateur ou à tester la prise en charge des dimensions de canevas personnalisées, consultez canvas-size .
À partir de la documentation:
Un lien de démonstration et les résultats des tests sont disponibles dans le README , ainsi qu'une section sur les problèmes connus qui aborde les considérations relatives aux performances et aux machines virtuelles.
Divulgation complète, je suis l'auteur de la bibliothèque. Je l'ai créé en 2014 et j'ai récemment revisité le code d'un nouveau projet lié au canevas. J'ai été surpris de constater le même manque d'outils disponibles pour détecter les limitations de taille de la toile en 2018, j'ai donc mis à jour le code, l'ai publié et j'espère que cela aidera d'autres personnes à rencontrer des problèmes similaires.
la source
Selon les spécifications de w3 , l'interface largeur / hauteur est une longueur non signée - donc de 0 à 4 294 967 295 (si je me souviens bien de ce nombre - peut-être quelques-uns).
EDIT: Étrangement, il dit long non signé, mais il teste juste une valeur longue normale comme max: 2147483647. Jsfiddle - 47 fonctionne mais jusqu'à 48 et il revient à la valeur par défaut.
la source
Même si le canevas vous permettra de mettre height = 2147483647, lorsque vous commencez à dessiner, rien ne se passe
Le dessin ne se produit que lorsque je ramène la hauteur à 32767
la source
iOS a des limites différentes.
En utilisant le simulateur iOS 7, j'ai pu démontrer que la limite est de 5 Mo comme ceci:
mais si j'augmente la taille du canevas d'une seule rangée de pixels:
la source
Sur PC,
je ne pense pas qu'il y ait de restriction mais oui, vous pouvez sortir de l'exception de mémoire.
Sur les appareils mobiles -
Voici les restrictions pour le canevas pour les appareils mobiles: -
La taille maximale d'un élément de canevas est de 3 mégapixels pour les appareils avec moins de 256 Mo de RAM et de 5 mégapixels pour les appareils avec plus ou égal à 256 Mo de RAM.
Par exemple, si vous souhaitez prendre en charge le matériel plus ancien d'Apple, la taille de votre canevas ne peut pas dépasser 2048 × 1464.
J'espère que ces ressources vous aideront à vous retirer.
la source
Les limitations de Safari (toutes les plates-formes) sont beaucoup plus faibles.
Limitations connues d'iOS / Safari
Par exemple, j'avais un tampon de toile de 6400x6400px avec des données dessinées dessus. En traçant / exportant le contenu et en testant sur d'autres navigateurs, j'ai pu voir que tout allait bien. Mais sur Safari, cela passerait le dessin de ce tampon spécifique dans mon contexte principal.
la source
J'ai essayé de déterminer par programme la limite: définir la taille de la toile à partir de 35000, descendre de 100 jusqu'à ce qu'une taille valide soit trouvée. À chaque étape, écrire le pixel en bas à droite, puis le lire. Cela fonctionne - avec prudence.
La vitesse est acceptable si la largeur ou la hauteur est réglée sur une valeur faible (par exemple 10-200) de cette façon:
get_max_canvas_size('height', 20)
.Mais s'il est appelé sans largeur ou hauteur comme
get_max_canvas_size()
, le canevas créé est si grand que la lecture de la couleur SINGLE pixel est très lente, et dans IE provoque un sérieux blocage.Si ce test pouvait être fait d'une manière ou d'une autre sans lire la valeur des pixels, la vitesse serait acceptable.
Bien sûr, le moyen le plus simple de détecter la taille maximale serait un moyen natif d'interroger la largeur et la hauteur maximales. Mais Canvas est «un niveau de vie», donc peut-être arrivera-t-il un jour.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Attention, votre navigateur peut se bloquer!)
la source
Lorsque vous utilisez des toiles WebGL, les navigateurs (y compris ceux de bureau) imposent des limites supplémentaires sur la taille du tampon sous-jacent. Même si votre toile est grande, par exemple 16 000x16 000, la plupart des navigateurs afficheront une image plus petite (disons 4096x4096) et la redimensionneront. Cela pourrait provoquer une pixellisation laide, etc.
J'ai écrit du code pour déterminer cette taille maximale en utilisant la recherche exponentielle, si quelqu'un en a besoin.
determineMaxCanvasSize()
est la fonction qui vous intéresse.Aussi dans un jsfiddle https://jsfiddle.net/1sh47wfk/1/
la source
Vous pouvez le découper et ajouter automatiquement en javascript autant de toiles plus petites que nécessaire et dessiner les éléments sur le canevas approprié. Il se peut que vous manquiez encore de mémoire, mais vous obtiendriez la limite du canevas unique.
la source
Je ne sais pas comment détecter la taille maximale possible sans itération, mais vous pouvez détecter si une taille de toile donnée fonctionne en remplissant un pixel, puis en lisant la couleur. Si le canevas n'a pas été rendu, la couleur que vous récupérez ne correspondra pas. W
code partiel:
la source