Seite 1 von 1

[gelöst] QImage::Format -> const char* (nicht möglich!)

Verfasst: 10. Dezember 2009 09:55
von N¤X
Hallo,

ich hab nen Dateinamen und will das darunter zu findende Bild in ein QImage laden, aber mit nem bestimmten Format. Die meisten Konstruktoren von QImage nehmen auch ein Format vom Typ "QImage::Format" (ein einfacher Enum) an, nur der Konstruktor der nen Dateinamen schluckt will das Format als "const char*", also nen C-String.
Ich hätte gerne das Format "QImage::Format_RGB32, Wert:4" und hab schon ausprobiert:
  • QImage(filename, "QImage::Format_RGB32");
    QImage(filename, "Format_RGB32");
    QImage(filename, "4");
    QImage(filename, (char*)QImage::Format_RGB32); // aus Verzweiflung :/
    QImage(filename, QImage::Format_RGB32); // auch aus Verzweiflung -_-
Die ersten drei Versuche ignoriert er völlig (die Images haben danach trotzdem das Format 3, genauso wie ohne zweitem Parameter), beim vierten schmiert es zur Laufzeit ab und das letzte kompiliert erst garnicht (ist ja auch verständlich, aber man muss es ja mal probiert haben...).
In der Doku hab ich leider kein Beispiel gefunden und im Web find ich nur zig Mirrors von der Doku. Oo
Was muss ich denn da jetzt übergeben, weiß das zufällig einer?

PS: Ich könnte es natürlich auch einfach normal laden und dann das Format konvertieren, aber da ich viele große Bilder auf einmal lade, und das allein schon lang genug dauert, würde ich das gerne vermeiden und gleich richtig laden...

Verfasst: 10. Dezember 2009 10:07
von RHBaum
The loader attempts to read the image using the specified format. If the format is not specified (which is the default), the loader probes the file for a header to guess the file format.
Der konstruktor heisst:
QImage::QImage ( const char * fileName, const char * format = 0 )

somit sind
QImage img(filename,0);
QImage img(filename);
eigentlich gleichbedeutetnd.

ist Format 0, versucht Qt das format anhand des headers selber zu erkennen ...

Willst du das format selber angeben, um Qt auf die Spruenge zu helfen, gibts ne Tabelle dafuer fuer die standardformate, die die Qt mit sich bringt:
BMP Windows Bitmap Read/write
GIF Graphic Interchange Format (optional) Read
JPG Joint Photographic Experts Group Read/write
JPEG Joint Photographic Experts Group Read/write
PNG Portable Network Graphics Read/write
PBM Portable Bitmap Read
PGM Portable Graymap Read
PPM Portable Pixmap Read/write
TIFF Tagged Image File Format Read/write
XBM X11 Bitmap Read/write
XPM X11 Pixmap Read/write

QImage img(filename,"BMP");
wuerde also vorraussetzen, das dein file auch nen Bitmap ist.
DIe liste der unterstützten formate kann per plugins erweitert werden, des halb koennen hier auch noch welche hinzukommen ...

Ciao ...

Verfasst: 10. Dezember 2009 10:17
von franzf
Und wenn du dein Bild jetzt nach RGB32 haben willst, nimmst du convertToFormat.

Code: Alles auswählen

QImage imgOrg("my_image.png");
QImage image = imgOrg.convertToFormat(QImage::Format_RGB32);

Verfasst: 10. Dezember 2009 10:23
von N¤X
Also heißt das, dass bei den beiden Konstruktoren nicht das QImage::Format sondern die Dateiendung gemeint ist? Dann ist das in der Dokumentation aber sehr fehl-leitend, weil da nirgends explizit drauf hingewiesen wird und immer von "format" gesprochen wird, egal ob jetzt das Farb- oder das Dateiformat gemeint ist, und die Parameter in ähnlichen Konstruktoren auch noch gleich heißen. -_-
Ich nehme dann auch mal an, dass man Bilder wohl nicht direkt in nem bestimmten Format (im Sinne von QImage::Format) laden kann. Das ist bei näherer Überlegung auch garnicht mal so unlogisch Oo"

Dann konvertier ich halt doch. Falls jemand noch was spannendes dzu weiß kann ers gerne noch posten, aber ich markier den Thread einfach mal als gelöst. Danke ^^

edit: Und so siehts jetzt aus :/

Code: Alles auswählen

img = new QImage(filename);
   if (img->format() != QImage::Format_RGB32) {
      *img = img->convertToFormat(QImage::Format_RGB32);
   }

Verfasst: 10. Dezember 2009 10:34
von franzf
Du darfst da auch ruhig mitdenken :D

Wenn ich schon ein Flag habe, warum sollte ich einen Konstruktor anbieten, der das Flag plötzlich als String will? String-Vergleiche sind teurer als die von Integer (->enum).
Daraus ergibt sich schonmal, dass das etwas anderes sein muss.
Dann schau ich mir die Doku an.
Da steht:
The loader attempts to read the image using the specified format. If the format is not specified (which is the default), the loader probes the file for a header to guess the file format.
Aha! Es wird etwas aus dem Bild-Header gelesen. Bei genauerer Betrachtung wird klar, dass ein Bild überhaupt nichts mit Qt zu tun hat, und jedes Format eine eigene Spezifikation hat. Demnach ist auch klar, dass da 100%ig nicht "QImage::Format_RGB32" drinnen steht.

Wenn man dann nur ein einziges mal die Doku zu QImage etwas genauer anschaut, stößt man auf die Tabelle die RHBaum sogar noch hier rein kopiert hat. Und da steht auch Format. Klar, JPeg, PNG, BMP nennt man üblicherweise Bild-Fomat. Demnach ist der gleiche Parametername auch angebracht.

Nur als kleiner Hinweis wie man versuchen könnte die Doku zu lesen und zu verstehen ;)

Verfasst: 10. Dezember 2009 10:39
von N¤X
Naja, ist mir schon klar, dass keine Qt-Enums in Fileheadern stehen, aber die Bittiefe und Bitverteilung steht normalerweise schon im Fileheader, daher hat mich das nicht weiter stutzig gemacht. Ans Dateiformat hab ich zugegebenermaßen nicht gedacht, das hat bisher immer einfach getan, und ich hab mir keinen Kopf gemacht, dass das auch grad an der Stelle passiert, hatte grad nur Farbformate im Kopf (Tunnelblick) ^^"