Seite 1 von 1

Embedded-Bereich Bild mit - QImage oder QPixmap laden

Verfasst: 23. Juli 2009 08:49
von spawnb
Hallo,

ich habe leider ein allgemeines Verständnis Problem bei dem ihr mir vielleicht helfen könnt.

Ich habe eine C++ App mit Qt 4.5 entwicklet, in der recht viele Bilder (800x600 24-Bit -96dpi - jpg) geladen und angezeigt werden. Hier ist die Information WICHTIG, wenn das Programm ca 50 Bilder lädt und anzeigt beträgt die Speicherauslastung im Taskmanager ca 40-50MB

Nun bin ich dabei dieses Programm in leicht abgeändertet Form auf ein embedded WinCE-System mit 128RAM zu übertragen.

Schon nach Realisierung der ersten Module in denen gerade mal 2-4 Bilder geladen werden, bekomme ich bei der Ausführung solche tollen Fehler:
QImage: out of memory, returning null
Diese tretten mal direkt beim laden der Bilder auf oder beim anzeigen.

Zu dem Thema ist das einzige was ich gefunden habe das hier:
http://lists.trolltech.com/pipermail/qt ... 00376.html

Mal davon abgesehen das ich nur 24-Bit JPEG's nutze, wenn dem so sein sollte, wieso ist es nicht in der win32-App so, nach ausfürhlichen Test's geht die Speicherauslastung bei dem oben genannten Beispiel (50 Bilder nie über 50MB), laut der Aussage müsste aber schon beim laden eines Bildes die Speicherauslastung weit über 50MB gehen.

Ein Bild mit einer Auflösung von 800x600 kann ich auf dem embedded-System nicht laden, ich habe jetzt schon die Auflösung der Bilder auf 350x250 gesenkt, um überhaupt laden zu können.

Auf dem embedded-System liegt die gesamte Speicherauslastung beim laden von ca 3 Bildern bei 21MB minus 7MB-System also ca 14MB-App-Speicherauslastung.

Entferne ich die 3 Bilder liegt die auslastung bei 20MB minus 7MB-System also 13MB

...gerade mal 1 MB weniger, da verstehe ich nicht warum ich nicht z.B. locker 20 Bilder laden kann bei 128RAM


Jemand eine Idee ..???

Verfasst: 23. Juli 2009 18:59
von NothingSpecial
Hi,

es könnte verschiedene Erklärungen für dein Problem geben. Welche von meiner Sicht folgende Fragen aufwerfen, auch wenn ich keine Ahnung von WinCE habe:

Wie wird der Speicher alloziert? Wann?
- Ziel dieser Frage: Vielleicht gibt es Unterschiede beim allozieren des Speichers bei Win32 und WinCE, Qt nimmt meines Wissens oftmals die original- API, vielleicht gibt es dort Unterschiede, auch in Sachen Restriktionen der maximalen Größe eines Programms im Speicher.

Welches Format haben deine QImages?
- Ziel hier: Das Dateiformat ist relativ unwichtig, man kann auch ein 2bit Schwarz/weiß Bild als 32Bit ARGB Bild in den Speicher laden.

Was bedeutet
spawnb hat geschrieben:Entferne ich die 3 Bilder liegt die auslastung bei 20MB minus 7MB-System also 13MB
Wann entfernst du die Bilder? Was passiert bevor du die Bilder lädst?
- Das Betriebssystem entscheidet über die Freigabe des Speichers. Wenn du den Speicher für die Bilder allozierst, kannst du vielleicht was messen, aber nicht wenn du sie löschst. Vielleicht gibt WinCE den Speicher langsam frei.

Allgemein können Bilder im Speicher schon recht groß werden:

600x800x24 =
11 520 000 bit
1 440 000 byte

600x800x32 =
15 360 000 bit
1 920 000 byte

Die Größe des QImages kannst du ja mal mit sizeof() bestimmen.

Die Angabe der dpi hat eigentlich keine Auswirkung. Sie sagt nur aus, wie groß das Bild im Druck ist. Obwohl ich mir da nicht 100% sicher bin, ob Windows die Größe simuliert.

Geholfen hat das sicher noch nicht, aber vielleicht ein paar Denkanstöße gegeben ;)

Grüße,

NothingSpecial

Verfasst: 23. Juli 2009 19:26
von spawnb
Hi, danke für die Antwort...

kurz zur Frage:
Was bedeutet
spawnb hat Folgendes geschrieben:
Entferne ich die 3 Bilder liegt die auslastung bei 20MB minus 7MB-System also 13MB

Die App lädt beim Start alle Bilder aus einem definierten Ordner, diese kann man sich dann nach einander anzeigen lassen.
Ein Start mit 3 Bilder im Ordner und ein zweiter Start der App ohne Bilder im Ordner, ergab 1-MB Unterschied in der Speicherauslastung im Taskmanager. Mit anderen Worten die 3 Bilder haben ca. 1-MB benötigt.
Also sollten doch bei 128MB-RAM z.B. locker 20 Bilder drin sein, was leider nicht der Fall ist.

geladen werden die Bilder so...

Code: Alles auswählen

QPixmap pix(path);
content_label->setPixmap( pix );
Ich habe auch so einen Quatsch probiert:

Code: Alles auswählen

QImage img(path);
QPixmap pix;
pix.fromImage(img);
content_label->setPixmap( pix );
Auch Experimente wie dies ergaben kein Erfolg:

Code: Alles auswählen

QImage img = Image->scaled(w, h, Qt::IgnoreAspectRatio, mode);
QImage* result = new QImage(h, w, QImage::Format_RGB16);
for(int x = 0; x < w; x++)
    for(int y = 0; y < h; y++)
      result->setPixel(y, x, img.pixel(x, y));

Verfasst: 23. Juli 2009 19:40
von NothingSpecial
Was passiert bei dem WinCE wenn du mit malloc mehrmals nacheinander 1MByte allozierst? Kannst du den ganzen Speicher vollknallen?

Verfasst: 23. Juli 2009 22:24
von spawnb
teste ich morgen mal