Ich arbeite mit einem Canvas-Element mit einer Höhe von 600
bis zu 1000
Pixeln und einer Breite von mehreren Zehntausend oder Hunderttausenden von Pixeln. Nach einer bestimmten Anzahl von Pixeln (offensichtlich unbekannt) zeigt die Leinwand jedoch keine Formen mehr an, die ich mit JS zeichne.
Weiß jemand, ob es ein Limit gibt?
Getestet sowohl in Chrome 12 als auch in Firefox 4.
javascript
html
canvas
Ernst
quelle
quelle
tens OR hundreds of thousands
...Antworten:
Aktualisiert am 13.10.2014
Alle getesteten Browser haben Grenzen für die Höhe / Breite von Canvas-Elementen, aber viele Browser beschränken auch die Gesamtfläche des Canvas-Elements. Für die Browser, die ich testen kann, gelten folgende Grenzwerte:
Chrom:
Maximale Höhe / Breite: 32.767 Pixel
Maximale Fläche: 268.435.456 Pixel (z. B. 16.384 x 16.384)
Feuerfuchs:
Maximale Höhe / Breite: 32.767 Pixel
Maximale Fläche: 472.907.776 Pixel (z. B. 22.528 x 20.992)
IE:
Maximale Höhe / Breite: 8.192 Pixel
Maximale Fläche: N / A.
IE Mobile:
Maximale Höhe / Breite: 4.096 Pixel
Maximale Fläche: N / A.
Andere:
Ich kann derzeit keine anderen Browser testen. Weitere Grenzwerte finden Sie in den anderen Antworten auf dieser Seite.
Das Überschreiten der maximalen Länge / Breite / Fläche in den meisten Browsern macht die Leinwand unbrauchbar. (Zeichnungsbefehle werden auch im verwendbaren Bereich ignoriert.) IE und IE Mobile berücksichtigen alle Zeichenbefehle innerhalb des nutzbaren Bereichs.
quelle
<canvas>
Elemente verwendet und Zeichenanweisungen automatisch auf den entsprechenden Kontext angewendet hat.Ich habe bei Firefox Speicherfehler mit Canvas-Höhen von mehr als 8000 festgestellt. Chrom scheint viel höher zu sein, zumindest bis 32000.
BEARBEITEN: Nachdem ich einige weitere Tests ausgeführt habe, habe ich einige sehr seltsame Fehler mit Firefox 16.0.2 gefunden.
Erstens scheine ich ein anderes Verhalten als im Speicher (in Javascript erstellt) zu haben, im Gegensatz zu HTML-deklarierter Leinwand.
Zweitens, wenn Sie nicht über das richtige HTML-Tag und den richtigen Meta-Zeichensatz verfügen, ist die Zeichenfläche möglicherweise auf 8196 beschränkt, andernfalls können Sie auf 32767 wechseln.
Drittens, wenn Sie den 2D-Kontext der Zeichenfläche abrufen und dann die Zeichenflächengröße ändern, sind Sie möglicherweise auch auf 8196 beschränkt. Durch einfaches Festlegen der Canvas-Größe vor dem Abrufen des 2D-Kontexts können Sie bis zu 32767 haben, ohne dass Speicherfehler auftreten.
Ich konnte die Speicherfehler nicht konsistent abrufen. Manchmal wird sie nur beim Laden der ersten Seite angezeigt, und nachfolgende Höhenänderungen funktionieren. Dies ist die HTML-Datei, die ich mit http://pastebin.com/zK8nZxdE getestet habe .
quelle
Maximale iOS-Leinwandgröße (Breite x Höhe):
getestet im März 2014.
quelle
So erweitern Sie die Antwort von @FredericCharette ein wenig: Gemäß dem Inhaltshandbuch von Safari unter Abschnitt " Kenne die Ressourcenbeschränkungen für iOS":
Daher funktioniert jede Größenänderung von 5242880 (5 x 1024 x 1024) Pixel auf großen Speichergeräten, andernfalls sind es 3145728 Pixel.
Beispiel für eine Leinwand mit 5 Megapixeln (Breite x Höhe):
und so weiter..
Die größten SQUARE-Leinwände sind ("MiB" = 1024x1024 Bytes):
quelle
Update für 2018:
Im Laufe der Zeit haben sich die Einschränkungen für die Leinwand geändert. Was sich leider nicht geändert hat, ist die Tatsache, dass Browser über die Canvas-API immer noch keine Informationen zu Einschränkungen der Canvas-Größe bereitstellen.
Wenn Sie die maximale Leinwandgröße des Browsers programmgesteuert ermitteln oder die Unterstützung für benutzerdefinierte Leinwandabmessungen testen möchten, lesen Sie die Leinwandgröße .
Aus den Dokumenten:
In der README-Datei finden Sie einen Demo-Link und Testergebnisse sowie einen Abschnitt mit bekannten Problemen, in dem die Leistung und Überlegungen zur virtuellen Maschine behandelt werden.
Vollständige Offenlegung, ich bin der Autor der Bibliothek. Ich habe es bereits 2014 erstellt und kürzlich den Code für ein neues Canvas-Projekt überarbeitet. Ich war überrascht, dass 2018 derselbe Mangel an verfügbaren Tools zum Erkennen von Einschränkungen der Leinwandgröße festgestellt wurde. Deshalb habe ich den Code aktualisiert, veröffentlicht und hoffe, dass er anderen hilft, auf ähnliche Probleme zu stoßen.
quelle
Gemäß den w3-Spezifikationen ist die Breite / Höhe-Schnittstelle eine vorzeichenlose Länge - also 0 bis 4.294.967.295 (wenn ich mich richtig an diese Zahl erinnere - könnten einige davon abweichen).
BEARBEITEN: Seltsamerweise heißt es unsigned long, aber beim Testen wird nur ein normaler langer Wert als max: 2147483647 angezeigt. Jsfiddle - 47 funktioniert, aber bis zu 48, und es wird auf die Standardeinstellungen zurückgesetzt.
quelle
Obwohl Sie auf der Leinwand die Höhe = 2147483647 festlegen können, geschieht beim Zeichnen nichts
Das Zeichnen geschieht nur, wenn ich die Höhe auf 32767 zurückbringe
quelle
iOS hat unterschiedliche Grenzen.
Mit dem iOS 7-Simulator konnte ich zeigen, dass das Limit 5 MB beträgt:
aber wenn ich die Leinwandgröße um eine einzelne Pixelreihe vergrößere:
quelle
Auf dem PC -
ich glaube nicht, dass es eine Einschränkung gibt, aber ja, Sie können eine Speicherausnahme bekommen.
Auf Mobilgeräten -
Hier sind die Einschränkungen für die Zeichenfläche für Mobilgeräte: -
Die maximale Größe für ein Canvas-Element beträgt 3 Megapixel für Geräte mit weniger als 256 MB RAM und 5 Megapixel für Geräte mit mehr oder mehr als 256 MB RAM.
Wenn Sie beispielsweise die ältere Hardware von Apple unterstützen möchten, darf die Größe Ihrer Leinwand 2048 × 1464 nicht überschreiten.
Hoffe, diese Ressourcen werden Ihnen helfen, Sie herauszuholen.
quelle
Die Einschränkungen für Safari (alle Plattformen) sind viel geringer.
Bekannte Einschränkungen für iOS / Safari
Zum Beispiel hatte ich einen 6400x6400px-Canvas-Puffer mit darauf gezeichneten Daten. Durch Verfolgen / Exportieren des Inhalts und Testen in anderen Browsern konnte ich feststellen, dass alles in Ordnung war. Aber auf Safari würde es das Zeichnen dieses spezifischen Puffers in meinem Hauptkontext überspringen.
quelle
Ich habe versucht, das Limit programmgesteuert herauszufinden: Festlegen der Leinwandgröße ab 35000, Verringern um 100, bis eine gültige Größe gefunden wurde. Schreiben Sie in jedem Schritt das Pixel unten rechts und lesen Sie es dann. Es funktioniert - mit Vorsicht.
Die Geschwindigkeit ist akzeptabel, wenn entweder Breite oder Höhe auf einen niedrigen Wert (z. B. 10-200) eingestellt wird:
get_max_canvas_size('height', 20)
.Wenn
get_max_canvas_size()
die erstellte Leinwand jedoch ohne Breite oder Höhe aufgerufen wird , ist die erstellte Leinwand so groß, dass das Lesen einer einzelnen Pixelfarbe sehr langsam ist und im IE zu ernsthaften Hängen führt.Wenn dieser ähnliche Test auf irgendeine Weise durchgeführt werden könnte, ohne den Pixelwert zu lesen, wäre die Geschwindigkeit akzeptabel.
Natürlich ist der einfachste Weg, die maximale Größe zu ermitteln, eine native Methode, um die maximale Breite und Höhe abzufragen. Aber Leinwand ist 'ein Lebensstandard', also kann es sein, dass es eines Tages kommt.
http://jsfiddle.net/timo2012/tcg6363r/2/ (Achtung! Ihr Browser kann hängen bleiben!)
quelle
Wenn Sie WebGL-Leinwände verwenden, legen die Browser (einschließlich der Desktop-Leinwände) zusätzliche Beschränkungen für die Größe des zugrunde liegenden Puffers fest. Selbst wenn Ihre Leinwand groß ist, z. B. 16.000 x 16.000, rendern die meisten Browser ein kleineres Bild (z. B. 4096 x 4096) und vergrößern es. Das kann zu hässlichen Pixeln usw. führen.
Ich habe Code geschrieben, um diese maximale Größe mithilfe der Exponentialsuche zu bestimmen, falls jemand sie jemals benötigt.
determineMaxCanvasSize()
ist die Funktion, die Sie interessiert.Auch in einer jsfiddle https://jsfiddle.net/1sh47wfk/1/
quelle
Sie können es zerlegen und in Javascript automatisch so viele kleinere Leinwände wie nötig hinzufügen und die Elemente auf die entsprechende Leinwand zeichnen. Möglicherweise geht Ihnen irgendwann immer noch der Speicher aus, aber Sie würden das Limit für eine einzelne Zeichenfläche erreichen.
quelle
Ich weiß nicht, wie ich die maximal mögliche Größe ohne Iteration erkennen kann, aber Sie können feststellen, ob eine bestimmte Leinwandgröße funktioniert, indem Sie ein Pixel füllen und dann die Farbe wieder auslesen. Wenn die Leinwand nicht gerendert wurde, stimmt die Farbe, die Sie zurückerhalten, nicht überein. W.
Teilcode:
quelle