hallo,
jetzt hab' ich's:
Es klappt sowohl mit QPixmap als auch mit QImage:
1. QPixmap
Der Tipp von Volker mit dem Header war es: Man muss den Bilddaten einen Header voranstellen, der aussieht wie der Header eines entsprechenden Files. Der Einfachheit halber nehme ich hierfür das PGM-Format. Der Code sieht dann so aus:
Code: Alles auswählen
#define BREIT 256
#define HOCH 256
#define HEADER 20 // muss Platz für den Header bieten
...
QPixmap bild;
uchar g8bild[BREIT * HOCH];
uchar zwsp[HEADER + BREIT * HOCH];
... // hier wird g8bild mit Daten gefüllt
sprintf((char*)zwsp,"P5\n%d %d\n255\n",BREIT, HOCH); // PGM-Header schreiben
j = strlen((char*)zwsp);
for (i=j; i<BREIT*HOCH+j; i++) // Daten von g8bild nach dem Header schreiben
zwsp[i] = g8bild[i-j];
bild.loadFromData( zwsp, BREIT * HOCH + j);
bild_ausgabe->setPixmap(bild); // Bild anzeigen im QLabel bild_ausgabe
Das Beispiel funktioniert mit 8Bit-Daten. Obwohl die load() function PGM-Bilder mit 16Bit Daten einlesen und darstellen kann, habe ich es nicht hingekriegt, mit loadFromData() 16bit Daten einzulesen. Ich setzte dazu im Header den maximalen Grauwert (3. Zahl) auf 10000 und fügte diesen Header vor ein unsigned short Array. Es wurden aber von QPixmap immer nur 8bit pro Pixel verwendet.
Ein weiterer Wermutstropfen ist, dass man immer einen Zwischenspeicher benötigt, um erst den Header und dann die Daten zusammen zu bekommen.
Deshalb gefällt mir jetzt doch die zweite Lösung mit QImage besser, danke KernelPanic.
Mit ein paar Änderungen sieht sie jetzt so aus:
2. QImage:
Code: Alles auswählen
#define BREIT 256
#define HOCH 256
QImage image(BREIT, HOCH, QImage::Format_RGB32);
uchar * lineData;
QRgb* linePix;
for(int y = 0; y < HOCH; y++)
{
lineData = image.scanLine(y);
linePix = (QRgb *)lineData; // mein Compiler braucht das so
for(int x = 0; x < BREIT; x++)
{
i=x+y*BREIT;
linePix[x] = qRgb((int)g8bild[i], (int)g8bild[i], (int)g8bild[i]);
}
}
bild_ausgabe->setPixmap(QPixmap::fromImage(image));
Hier wird kein Zwischenspeicher benötigt, sondern es werden direkt die Pixel von QImage beschrieben. Wenn man 16bit Daten hat, wie es in meinem Fall zutrifft, muss man auch hier die Skalierung auf 8bit selber machen.
Ein kleiner Nachteil liegt in diesem Verfahren noch. Man muss die Bildgröße schon vorher wissen.