Gibt es eine bekannte Größen- / Platzbeschränkung für QPixmap
und / oder QImage
Objekte? Ich habe diesbezüglich keine nützlichen Informationen gefunden. Ich verwende derzeit Qt 4.7.3 unter OSX und Windows. Besonders interessiert mich:
Ich würde naiv vermuten, dass Speicher die einzige Einschränkung ist, also könnte man die maximale Größe mit
berechnenBreite x Höhe x byte_per_pixel
Ich nehme an, dass es eine ausführlichere Faustregel gibt; Auch 32-Bit-Maschinen können Probleme mit der Adressierung haben, wenn Sie GB-Dimensionen verwenden.
Am Ende möchte ich mehrere RGBA-Bilder mit einer Größe von etwa 16000x16000 Pixel speichern und sie mit Hilfe von Transparenz in QGraphicsScene
rendern. Die verfügbare Arbeitsstation kann viel RAM haben, sagen wir 16GB.
tl; dr: Welche Größenbeschränkungen von QImage / QPixmap kennen Sie oder wo finde ich solche Informationen?
Bearbeiten: Ich bin mir des Tiling-Ansatzes bewusst und mir geht es gut. Trotzdem wäre es schön, die oben beschriebenen Dinge zu wissen.
Danke!
Beide sind auf 32767 x 32767 Pixel begrenzt. Das heißt, Sie können sich einen vorzeichenbehafteten 16-Bit-Wert für die X- und Y-Auflösung vorstellen.
Keine Achse kann 32767 Pixel überschreiten, auch wenn die andere Achse nur 1 Pixel groß ist. Betriebssystem "Bitness" hat keinen Einfluss auf die Begrenzung. Das zugrundeliegende System kann in andere Grenzen geraten, wie z. B. Speicher wie Sie erwähnt haben, bevor solch ein riesiges Bild erstellt werden kann.
Sie können ein Beispiel für diese Einschränkung im folgenden Quellcode sehen: Ссылка
%Vor%Aufbauend auf der Antwort von @ charles-brennt, hier ist der relevante Quelltext für QImage:
%Vor% Also ist bpl
die Anzahl der Bytes pro Zeile, was effektiv width * depth_in_bytes
ist. Verwenden von Algebra für diesen letzten ungültigen Test:
INT_MAX/uint(bpl) < uint(height)
INT_MAX < uint(height) * uint(bpl)
INT_MAX < height * width * depth_in_bytes
Ihre Bildgröße muss also kleiner als 2147483647 (für 32-Bit-Ints) sein.
Ich hatte tatsächlich die Gelegenheit, einmal darüber nachzudenken. Führen Sie im Quellcode von qimage.cpp
eine Suche nach "Plausibilitätsprüfung auf potenzielle Überläufe" durch und Sie können die Überprüfungen sehen, die Qt durchführt. Grundsätzlich
INT_MAX
. malloc
dieser Bytes an dem Punkt sein, an dem Sie die QImage
-Instanz erstellen. Bauen Sie eine 64-Bit-App? Wenn nicht, werden Sie sehr schnell auf Speicherprobleme stoßen. Unter Windows ist ein 32-Bit-Prozess selbst dann auf 2 GB beschränkt, wenn der Computer über 16 GB RAM verfügt (es sei denn, es handelt sich um LARGEADDRESSAWARE und dann um 3 GB). Ein 16000x16000 Bild wird knapp 1 GB groß sein, so dass Sie nur genügend Speicherplatz für 1, vielleicht 2, reservieren können, wenn Sie viel Glück haben.
Mit einer 64-Bit-App sollten Sie in der Lage sein, genügend Speicherplatz für mehrere Bilder zu reservieren.