122 votes

Taille maximale d'un élément <canvas>

Je travaille avec un élément de canevas d'une hauteur de 1 cm. 600 a 1000 pixels et une largeur de plusieurs dizaines ou centaines de milliers de pixels. Cependant, après un certain nombre de pixels (évidemment inconnu), la toile n'affiche plus les formes que je dessine avec JS.

Quelqu'un sait-il s'il y a une limite ?

Testé à la fois dans Chrome 12 et Firefox 4.

2 votes

@Šime Il a dit tens OR hundreds of thousands ...

6 votes

C'est également le cas pour moi. J'ai un canevas de 8000x8000 qui fonctionne bien, mais lorsque je l'agrandis, le contenu disparaît et le dessin est impossible. La taille à laquelle il ne fonctionne pas est beaucoup plus petite sur mon iPad. Je me demande si ce n'est pas une limitation de la mémoire.

34 votes

C'est bizarre quand on retrouve son propre commentaire datant de deux ans et qu'on est toujours confronté au même problème.

126voto

Brandon Gano Points 1717

Mis à jour le 13/10/2014

Tous les navigateurs testés ont des limites pour la hauteur/largeur des éléments de toile, mais de nombreux navigateurs limitent également la surface totale de l'élément de toile. Les limites sont les suivantes pour les navigateurs que je suis en mesure de tester :

Chrome :

Hauteur/largeur maximale : 32 767 pixels
Surface maximale : 268 435 456 pixels (par exemple, 16 384 x 16 384)

Firefox :

Hauteur/largeur maximale : 32 767 pixels
Surface maximale : 472 907 776 pixels (par exemple, 22 528 x 20 992)

IE :

Hauteur/largeur maximale : 8 192 pixels
Surface maximale : N/A

IE Mobile :

Hauteur/largeur maximale : 4 096 pixels
Surface maximale : N/A

Autre :

Je ne suis pas en mesure de tester d'autres navigateurs pour le moment. Reportez-vous aux autres réponses de cette page pour des limites supplémentaires.


Le dépassement de la longueur/largeur/zone maximale sur la plupart des navigateurs rend le canevas inutilisable. (Il ignorera toute commande de dessin, même dans la zone utilisable). IE et IE Mobile respecteront toutes les commandes de dessin dans l'espace utilisable.

3 votes

Alors, question connexe... comment contourner la limite si l'on a besoin d'une toile plus grande que le maximum autorisé ?

2 votes

@aroth, j'ai fini par écrire une enveloppe autour de l'API de canevas qui utilise de multiples empilages <canvas> et applique automatiquement les instructions de dessin au contexte approprié.

1 votes

Ça a l'air très utile. Je suppose qu'il n'est pas sur Github ?

16voto

Ben Burnett Points 143

J'ai rencontré des erreurs de mémoire sur Firefox avec des hauteurs de toile supérieures à 8000, chrome semble gérer des hauteurs bien supérieures, au moins jusqu'à 32000.

EDIT : Après avoir effectué d'autres tests, j'ai trouvé des erreurs très étranges avec Firefox 16.0.2.

Tout d'abord, il semble que le comportement des canevas en mémoire (créés en javascript) soit différent de celui des canevas déclarés en html.

Deuxièmement, si vous ne disposez pas de la balise html et du 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 risquez d'être limité à 8196 également. En définissant simplement la taille du canevas avant de saisir le contexte 2d, vous pouvez aller jusqu'à 32767 sans avoir d'erreurs de mémoire.

Je n'ai pas été en mesure d'obtenir systématiquement les erreurs de mémoire, parfois c'est seulement sur le premier chargement de la page, et puis les changements de hauteur suivants fonctionnent. Voici le fichier html avec lequel je testais http://pastebin.com/zK8nZxdE .

4 votes

"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" - qu'entendez-vous par balise html et jeu de caractères méta appropriés ici ?

1 votes

Vous voulez sûrement dire 8192 (2^13) ? 8196 est un nombre bizarre.

14voto

Dado Points 449

Taille maximale de la toile iOS (largeur x hauteur) :

 iPod Touch 16GB = 1448x1448
 iPad Mini       = 2290x2289
 iPhone 3        = 1448x1448
 iPhone 5        = 2290x2289

testé en mars 2014.

0 votes

Ces valeurs sont arbitraires. Veuillez consulter mon post ci-dessous qui fait référence au guide du contenu de Safari.

12voto

dcbarans Points 197

Pour développer un peu la réponse de @FredericCharette : Selon guide du contenu de safari à la section "Connaître les limites des ressources de l'iOS" :

La taille maximale d'un élément de toile est de 3 mégapixels pour les appareils dont la mémoire vive est inférieure à 256 Mo et de 5 mégapixels pour les appareils dont la mémoire vive est supérieure ou égale à 256 Mo.

Par conséquent, toute variation de taille de 5242880 (5 x 1024 x 1024) pixels fonctionnera sur les grands dispositifs de mémoire, sinon c'est 3145728 pixels.

Exemple pour une toile de 5 mégapixels (largeur x hauteur) :

Any total <= 5242880
--------------------
5 x 1048576 ~= 5MP   (1048576 = 1024 x 1024)
50 x 104857 ~= 5MP
500 x 10485 ~= 5MP

et ainsi de suite

Les plus grandes toiles CARRÉES sont ("MiB" = 1024x1024 Octets) :

device < 256 MiB   device >= 256 MiB   iPhone 6 [not confirmed]
-----------------  -----------------   ---------------------
<= 3145728 pixels  <= 5242880 pixels   <= 16 x 1024 x 1024 p
1773 x 1773        2289 x 2289         4096 x 4096

1 votes

Pour être plus précis, la limite de l'iPhone5 est de 3 * 1024 * 1024 = 3145728 pixels. (Après m'être demandé pourquoi ma toile était bien sous Android mais vide sous iOS, j'ai trouvé cette réponse, et aussi stackoverflow.com/questions/12556198/ et j'ai réussi à faire fonctionner mon application Phonegap).

0 votes

Pour information, Apple a supprimé les informations spécifiques sur la taille des images de "Safari / Know iOS Resource Limits". Il ne s'agit plus que de conseils génériques pour minimiser la bande passante en utilisant des images de petite taille.

0 votes

@matb33 a signalé dans un commentaire sur la question que l'iPhone 6 semble avoir la limite 16 * 1024 * 1024.

8voto

WSkid Points 1995

Selon w3 specs l'interface largeur/hauteur est un long non signé - donc de 0 à 4 294 967 295 (si je me souviens bien de ce nombre - je peux me tromper un peu).

EDIT : Bizarrement, il est indiqué unsigned long, mais le test montre juste une valeur longue normale comme valeur maximale : 2147483647. Jsfiddle - 47 fonctionne mais jusqu'à 48 et il revient à la valeur par défaut.

0 votes

Hmm. Intéressant, mais je n'arrive même pas à 1,5 milliard.

0 votes

Modifié, désolé (c'est ce que j'obtiens pour ne pas avoir testé d'abord) -- j'ai ajouté un jsfiddle pour montrer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X