Anzeige von ganz großen Bildern

Alles rund um die Programmierung mit Qt
Antworten
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Anzeige von ganz großen Bildern

Beitrag von lepsai »

Ein sehr unangenehmes Problem: (in Qt, befürchte ich...)

Die Bilddateien, die größer als ~100 MB sind, werden zwar durch QImageIO geladen, können aber nicht zu einem QPixmap konvertiert werden. Das Ergebnis der Konvertierung ist QPixmap::null.
Das Beispiel showImg von den Trolls stürzt einfach ab.

Ideen?

P.S. Das Ganze mit: Windows XP SP 2, Qt 3.3.3 Comm., VS 6.0
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Bilder mit 100MB??? Was sind das denn für riesige Teile? Naja, wenn es einen Qt Fehler gibt ist es das leichteste die Class zu vererben und die gebrauchten Funktionen selber zu schreiben, eben ohne Fehler. Wobei erhlich gesagr, kann ich mir das sehr gut vorstellen, das Qt bei 100MB Bilddatei motzt. Mein erster Gedanke war.... wer kommt auf solch eine Idee.
Zuletzt geändert von FlorianBecker am 4. Oktober 2005 10:49, insgesamt 1-mal geändert.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Nun, es geht um ein Tool für die industrielle Bildverarbeitung und da gibt es Bilder, die mehrere Giga groß sind. Ein Bitmap > 100 MB kriegtste z.B. wenn du ein A4 Vorlage mit 600 DPI scannst. Das ist also wirklich nix besonderes.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Mh, wirklich groß.
Ja, wie gesagt, Fehler gehen mit Vererbung weg, wenn du das gut implementierst.
Zuletzt geändert von FlorianBecker am 4. Oktober 2005 10:49, insgesamt 1-mal geändert.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

nun, zu reimplementieren wäre dann QPixmap... und das ist viel zu viel Aufwand....
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Vielleicht ist es auch falsch angesprochen. Könnte dir besser helfen, wenn du den Code posten könntest.
Zuletzt geändert von FlorianBecker am 4. Oktober 2005 10:49, insgesamt 1-mal geändert.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

QImageIO io;

io.load("xxx.bmp");
QImage * img = io.image();
if(img->isNull() )
// hier gehts noch

QPixmap pix;

pix.convertFromImage(*img);
if(pix.isNull())
// und hier ist dann Feierabend
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Mh, bedeutet das, das der convert noch geht, die if geht noch und dann verabschidet sich das programm? was steht hinter if (pix.isNull() ) ???
wenn du da keinen return machst, und weiter funktionen mit pix verarbeitest kanns nur schief gehen.
Zuletzt geändert von FlorianBecker am 4. Oktober 2005 10:49, insgesamt 1-mal geändert.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ja, da findet dann die Fehlerbehandlung statt und es stürzt auch nichts ab. aber das Pixmap hat die Nullgröße und kann nicht angezeigt werden.
Ich habe jetzt folgendes herausgefunden: es sind Win API Funktionen, die nicht laufen: Ich kriege mit GetLastError() folgende Fehelermeldung: Für diesen Befehl ist nicht genügend Speicher verfügbar.
In einem alten Programm von mir, das reines Win API benutzt, geht alles wunderbar. Keine Ahnung, was das sein kann.
Spring-Daniel
Beiträge: 40
Registriert: 4. Oktober 2004 16:26

Beitrag von Spring-Daniel »

Das wuerde sich auch mit der Doku von QPixmap decken:
Note regarding Windows 95 and 98: on Windows 9x the system crashes if you create more than about 1000 pixmaps, independent of the size of the pixmaps or installed RAM. Windows NT-systems (including 2000, XP and following versions) do not have the same limitation, but depending on the graphics equipment the system will fail to allocate pixmap objects at some point (due to system running out of GDI resources).
Ja, ich weiss, ich zitiere gerne die Doku, aber wenn nunmal alles drinsteht?! :)
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ja, das habe ich schon auswendig gelernt. Das ist aber nicht der Fall. Da die Resourcen da sind. Sonst würden die Win API Programme auch nicht funktionieren. Es werden die gleichen Funktionen aufgerufen:

CreateCompatibleBitmap(), CreateBitmap(), CreateDIBSection() usw.

Ausserdem ist bei mir nicht die Anzahl der Bilder entscheidend, sondern die Größe.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da Du eine Qt-Lizenz hast würde ich einfach mal bei TT anfragen ob die was dazu wissen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ich habe noch keine offizielle Lizenz gekauft... Benutze zurzeit eine inoffizielle 3.3.3 Comm. :)

So, nach einer langen Recherche habe folgendes herausgefunden:

Bei meinem Win API Programm habe ich folgendes übersehen: ich alloziere bei CreateCompatibleBitmap() nur soviel Speicher ich für die Anzeige brauche, also unabhängig von der Bildgröße. Richtwert ist dabei die Fenstergröße. Trolls allozieren aber den gesamten Bildspeicher mit CreateCompatibleBitmap() und das zieht nicht...

Ok, da muss ich mir wqas einfallen lassen...
Antworten