Seite 1 von 1

[gelöst] QImage auffüllen und anzeigen, geht nicht

Verfasst: 17. August 2006 21:37
von René
Hallo,

das Problem ist eigentlich ganz einfach.
Ich möchte ein Graustufenbild, also channel = 1, depth = 8 bit, erzeugen und das mit einem Graustufenwert auffüllen. Das mache ich so:

Code: Alles auswählen

QImage *qtImage = new QImage( 1024, 768, QImage::Format_Indexed8 ); // Anlegen eines Bildes auf dem Heap
qtImage->fill(200); // auffüllen mit hellem Grauton
Das Bild möchte ich mir nun ansehen und stelle es dazu auf einem QLabel dar:

Code: Alles auswählen

QLabel *label = new QLabel();
label->setPixmap( QPixmap::fromImage(*qtImage) );
label->show();
Wenn ich das Programm ausführe kommt folgender Fehler (VS2005):

Code: Alles auswählen

Debug Error!

Program: ...
Module: 4.1.4
File: d:\programme\qt4\4.1.4\src\corelib\global\qglobal.cpp
Line: 2087

ASSERT failure in QVector<T>::at: "index out of range", file d:\programme\qt4\4.1.4\src\corelib\tools\qvector.h, line 213

(Press Retry to debug the application)
Da werde ich nicht schlau draus. Das Programm funktioniert übrigens einwandfrei, wenn ich die Zeile 2 mit qtImage->fill(200) ersetze durch qtImage->load( QString("testGraustufenBild.png" ) );

Kann mir da jemand weiterhelfen ?

Verfasst: 17. August 2006 22:42
von dhcase
Den Fehler kann ich reproduzieren, wenn du z.B. QImage::Format_RGB32 verwendest dann funktioniert es... mehr weiss ich gerade auch nicht.

Verfasst: 17. August 2006 22:45
von René
Ok, Problem ist gelöst.

Ein 8bit Image ist bei Qt noch lange kein 1-Kanal Bild, es kann nachwievor aus vollem 32bit Farbraum (RGB+Alphakanal) schöpfen, nur kann es nur 256 verschiedene Farben maximal gleichzeitig besitzen, da diese in einer 8bit IndexTabelle gespeichert sind. Um ein Graustufenbild selbst zu erzeugen habe ich nun folgendes gemacht:

Code: Alles auswählen

QVector<QRgb> colorTable(256);
QRgb *data = colorTable.data();

for ( int i=0; i < 256; i++ )
  data[i] = qRgb(i, i, i);

qtImage->setColorTable(colorTable);
qtImage->fill(255);
Mit fill(255) erhält man dann weiß, mit fill(0) schwarz und mit Werten zwischen 0 und 255 alle Grautöne, die ein "echtes" 1-Kanal Graustufenbild besitzen kann.