QImage / QPixmap Größenbeschränkungen?

8

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:

  • Breite / Höhe begrenzt?
  • Grenzen abhängig vom Farbformat?
  • Unterschied zwischen 32/64 Bit Maschinen?
  • Unterschied bezüglich Betriebssystem?

Ich würde naiv vermuten, dass Speicher die einzige Einschränkung ist, also könnte man die maximale Größe mit

berechnen
  

Breite 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!

    
grefab 16.08.2011, 14:42
quelle

4 Antworten

9

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%     
Charles Burns 16.08.2011, 15:37
quelle
4

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.

    
Luke Worth 14.07.2014 01:51
quelle
2

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

  • Die Anzahl der benötigten Bytes (width * height * depth_for_format) muss kleiner sein als INT_MAX .
  • Es muss malloc dieser Bytes an dem Punkt sein, an dem Sie die QImage -Instanz erstellen.
Dave Mateer 16.08.2011 15:49
quelle
0

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.

    
Roland Rabien 18.08.2011 14:10
quelle

Tags und Links