Seite 1 von 1

Anzeige von ganz großen Bildern

Verfasst: 1. Dezember 2004 18:56
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

Verfasst: 2. Dezember 2004 11:09
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.

Verfasst: 2. Dezember 2004 11:23
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.

Verfasst: 2. Dezember 2004 11:34
von FlorianBecker
Mh, wirklich groß.
Ja, wie gesagt, Fehler gehen mit Vererbung weg, wenn du das gut implementierst.

Verfasst: 2. Dezember 2004 11:39
von lepsai
nun, zu reimplementieren wäre dann QPixmap... und das ist viel zu viel Aufwand....

Verfasst: 2. Dezember 2004 11:43
von FlorianBecker
Vielleicht ist es auch falsch angesprochen. Könnte dir besser helfen, wenn du den Code posten könntest.

Verfasst: 2. Dezember 2004 12:28
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

Verfasst: 2. Dezember 2004 13:03
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.

Verfasst: 2. Dezember 2004 13:25
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.

Verfasst: 2. Dezember 2004 18:57
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?! :)

Verfasst: 2. Dezember 2004 19:40
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.

Verfasst: 3. Dezember 2004 12:44
von Christian81
Da Du eine Qt-Lizenz hast würde ich einfach mal bei TT anfragen ob die was dazu wissen.

Verfasst: 6. Dezember 2004 14:01
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...