Seite 1 von 1
[gelöst]versteht Qt 16bit Grauwertbilder?
Verfasst: 24. November 2007 00:25
von qtNiko
hallo,
das pgm-Bildformat erlaubt Grauwerte mit bis zu 16bit pro Pixel.
In der Qt-Doku finde ich nur 8bit, 16bit RGB und 32bit RGB.
Ich möchte aber 16bit Grauwertbilder darstellen (tatsächlich sind vielleicht 12bit belegt), d.h. ich muss solche Bilder im pgm-Format einlesen, auf 8bit skalieren und als Grauwertbild darstellen.
Natürlich kann man das alles per Hand programmieren, aber wenn Qt schon etwas fertiges hätte, wäre es einfacher.
Wenn ich es nun per Hand machen muss, wohin schreibe ich dann am besten meine Pixeldaten, nach QImage, QPixmap?
Bei QPixmap gibt es ein loadFromData(). Dort kann ich jedoch nur die Gesamtzahl an Pixeln angeben und nicht, wieviele Zeilen/Spalten es sein sollen. Wo gebe ich denn das an?
Verfasst: 24. November 2007 10:57
von BartSimpson
Ich denke, da must du ein QImage Plugin erstellen.
Verfasst: 28. November 2007 16:17
von qtNiko
QT kann pgm-Bilder mit bis zu 16 bit pro Pixel zwar einlesen, aber dabei werden aus den 16 bits 8bits gemacht.
Man kann sich die Bilder auf diese Weise ansehen, aber die Originalgrauwerte sind weg.
Verfasst: 11. Februar 2009 11:11
von Konk
Ich wollte fragen ob jemand ein QImage-Plugin erstellt hat, mit dem es möglich ist 16-bit Bilder zu speichern?! Mit libpng und libtiff scheint das möglich zu sein, allerdings vermisse ich eine setPixel(x,y,value) Funktion. Falls jemand einen einfachen Weg kennt, 16-bit Graubilder auf die Festplatte zu bringen wäre ich über jeden Tipp dankbar.
Verfasst: 11. Februar 2009 21:14
von qtNiko
hallo,
also ich habe inzwischen eine für meinen Bedarf handgemachte Lösung.
Wenn ich mal Zeit habe, schaue ich mir an, wie man ein Qt-Plugin erzeugt, aber so lange kannst du wohl nicht warten

Verfasst: 16. Februar 2009 23:38
von qtNiko
hallo Konk,
hoffentlich siehst du diese Antwort. Komischerweise finde ich nämlich deine Frage hier nicht mehr, wie ich das mit den 16 bit pgm-Bildern gelöst habe (auf dem anderen Rechner, der die Mail-Notiz über deine Rückfrage erhalten hat, habe ich kein Eclipse, um den Code hier reinzukopieren).
Also, in meinem Fall geht es darum, pgm-Bilder mit 16 bit Grauwerten von Datei einzulesen.
PGM-Format bietet hier zwei Möglichkeiten, P2-Format, d.h. Pixelwerte in ASCII, oder P5, d.h. Pixelwerte binär. Ich habe P2 und lese die Datei mit einem C-Programm ein.
Das pgm-Format ist sehr einfach aufgebaut. Es besteht aus einem 3-zeiligen Header in ASCII und den Daten. Der Header sieht folgendermaßen aus:
P2
Breite Hoehe
max_Grauwert
... hier folgen die Pixelwerte
.
Code: Alles auswählen
unsigned short int get_1value_ffile(FILE *stream) {
char instr[120];
int nochmal;
do {
nochmal = FALSE;
fscanf(stream, "%s", instr);
if (instr[0] == '#') {
fgets(instr, sizeof(instr), stream); // Rest der Zeile einlesen
nochmal = TRUE;
}
} while (nochmal);
return ((unsigned short int)atoi(instr));
}
...
int i, j;
unsigned short int pBild[BREITE*HOEHE];
char bild_name[120];
FILE *bld_stream = NULL;
unsigned short int iBr, iHo, iMaxGw;
char aStr[80];
unsigned short int *pPixel;
// BREITE, HOEHE sind die Bildabmessungen und als #define vorgegeben
// LINE_OFFSET ist die Zeilenlänge des Bildspeichers, in den eingelesen wird
// Bilddatei in 16bit-Matrix einlesen:
fileName = QFileDialog::getOpenFileName(this, "Bilddatei waehlen", "./Daten/");
strcpy(bild_name, fileName.toAscii().constData()); // QString umwandeln in einen C-String
bld_stream = fopen(bild_name, "r");
if (bld_stream == NULL) {
QMessageBox::critical(this, tr("Titel"),
tr("Bilddatei kann nicht geoeffnet werden!"), QMessageBox::Ok);
return;
}
fscanf(bld_stream, "%s", aStr); // Kennung P2
iBr = get_1value_ffile(bld_stream);
iHo = get_1value_ffile(bld_stream);
iMaxGw = get_1value_ffile(bld_stream); //fscanf(stream, "%d", &iMaxGw);
if ((iBr == BREITE) && (iHo == HOEHE) && !strcmp(aStr,"P2")) {
bild_ausgabe->resize(iBr, iHo); // bild_ausgabe ist ein QLabel
for (j=0; j<iHo; j++) {
pPixel = pBild + j * LINEOFFSET;
for (i=0; i<iBr; i++) {
fscanf(bld_stream, "%u", pPixel);
pPixel++;
}
}
fclose(bld_stream);
Das ist vielleicht nicht die eleganteste Lösung, funktioniert aber.

Verfasst: 18. Februar 2009 14:58
von Konk
Hi Nico,
danke für den Code. Ich will ja den umgekehrten Weg gehen (speichern) und habs immer mit tif und png versucht, was nicht sehr intuitiv ist. Als pgm mit Aufteilen der Bytes habs ich noch nicht probiert, das ist ne gute Idee die Du da verfolgt hast.
Allerdings hat der Kollege für den ich dieses kleine Helferlein programmieren wollte sein Problem auf andere Weise gelöst. D.h. ich werd höchstens mal in ner ruhigen Minute versuchen, ob es mit den pgms funktioniert hätte.

Trotzdem vielen Dank!