Seite 1 von 2

raw mono8 grayscale bild in QPicture/Pixmap konvertieren

Verfasst: 28. Mai 2010 10:51
von marvin
Hallo Leute,

der Titel des threads sagt schon alles, ich hab ein ARRAY in dem ein grayscale 8 bit bild steckt, und ich möchte das umwandeln und auf der oberfläche anzeigen auf einem label1.

hat jemand ahnung ob es dafür schon fertige konvertierungsfunktionen gibt? oder wie ich das vll sogar mit QT selbst schon hinbekomme

mfg
marvin

Verfasst: 28. Mai 2010 11:29
von kater

Code: Alles auswählen

QImage ( const uchar * data, int width, int height, Format format )

Code: Alles auswählen

QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )
Nur mit dem Format seh ich Probleme. Qt hat anscheiend kein Format für 8bit Bilder.
Bau dir ein neues Array das die 3-fache Länge hat. Dann kannst du das RGB Format nutzen. Rot Grün und Blau haben den selben Wert, so bleibt es dann auch ein Graubild.

Verfasst: 28. Mai 2010 12:20
von Curtis Newton
kater hat geschrieben:
Nur mit dem Format seh ich Probleme. Qt hat anscheiend kein Format für 8bit Bilder.
QImage::Format_Indexed8

Auf keinen Fall QImage::setColorTable vergessen!

C.

Verfasst: 28. Mai 2010 20:49
von kater
In der Doku stand was von Format_Indexed8 und QImage = Problem. Aber irgendwie geht es schon :)

Verfasst: 4. Juni 2010 13:41
von marvin
hallo kann mir bitte noch mal jemand helfen , ich komm einfach nicht drauf wie ich das mono8 bild in QPixmap konvertieren kann.

Das muss doch irgendwie machbar sein

Verfasst: 4. Juni 2010 14:35
von RavenIV
Mithilfe der Suchfunktion habe ich diesen Thread gefunden.
http://qtforum.de/forum/viewtopic.php?t ... t=indexed8
Das könnte Dir weiterhelfen...

Verfasst: 7. Juni 2010 08:13
von Curtis Newton
marvin hat geschrieben:hallo kann mir bitte noch mal jemand helfen , ich komm einfach nicht drauf wie ich das mono8 bild in QPixmap konvertieren kann.

Das muss doch irgendwie machbar sein
Isses. Was hast denn schon versucht?

C.

Verfasst: 7. Juni 2010 13:44
von marvin
Hallo

folgenden Code habe ich probiert

Code: Alles auswählen

void SSDR::showPicture(char *x)
{
QImage img((uchar*)x,656,494,QImage::Format_Indexed8);
QPixmap pix = QPixmap::fromImage(img);
ui->imagelabel->setPixmap(pix);
}
Im Zeiger x sind die Bilddaten. Die Funktion hängt sich aber jedesmal beim debuggen auf.
Was wohl fehlt ist der Übergabeparamter int bytesPerLine //QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )//

Leider kann ich mit bytesPerLine nichts anfangen bzw. weiß nicht was die Kamera da liefert und habe dafür mal den Dummywert 200 übergeben. Dann läufts zumindest ohne abzustürzen aber ein Bild bekomm ich immer noch nicht angezeigt.

Ist der Code soweit korrekt? Und wie kann ich das Problem mit den bytesPerLine umgegehen?

Mfg

Verfasst: 7. Juni 2010 14:45
von Curtis Newton
marvin hat geschrieben:Hallo

folgenden Code habe ich probiert

Code: Alles auswählen

void SSDR::showPicture(char *x)
{
QImage img((uchar*)x,656,494,QImage::Format_Indexed8);
QPixmap pix = QPixmap::fromImage(img);
ui->imagelabel->setPixmap(pix);
}
Im Zeiger x sind die Bilddaten. Die Funktion hängt sich aber jedesmal beim debuggen auf.
Was wohl fehlt ist der Übergabeparamter int bytesPerLine //QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )//

Leider kann ich mit bytesPerLine nichts anfangen bzw. weiß nicht was die Kamera da liefert und habe dafür mal den Dummywert 200 übergeben. Dann läufts zumindest ohne abzustürzen aber ein Bild bekomm ich immer noch nicht angezeigt.

Ist der Code soweit korrekt? Und wie kann ich das Problem mit den bytesPerLine umgegehen?

Mfg
Bytes per line gibt halt an, wieviel Bytes eine Bildzeile hat. Das musst Du schon in der SDK-Doku Deiner Kamera nachsehen. Wir haben hier keine Glaskugel. Wenn Du mal drüber nachdenkst, siehst Du, dass diese Angabe mindestens so gross sein muss wie die Anzahl der Pixel pro Zeile.

Außerdem hast Du vergessen, die Palette zu setzen (siehe mein erstes Posting in diesem Thread).

C.

Verfasst: 7. Juni 2010 18:49
von marvin
was müsste dann in setColorTable stehen wenn ein pixel ein byte is ? und halt graustufen hat ? 256 graustufen?

hmm mit vector templates net so die erfahrung aber ich nehm mal an ich muss für jedes pixel quasi einen tabellen eintrag machen oder?

stimmt der code sonst soweit? und bytesPerLine müsste ich dann irgendwie vom hersteller rauskriegen.

mfg

Verfasst: 7. Juni 2010 19:44
von kater
Ich hab keine Ahnung weil noch nie gemacht. Aber die Doku sagt es doch.

Vllt. so

Code: Alles auswählen

QVector<QRgb>  table(256);
for(int i = 0; i < table.size(); i++)
{
  table[i] = qRgb ( i,i,i );
}

Verfasst: 8. Juni 2010 19:40
von marvin
danke für die tipps , ich werd morgen alles mal ausprobieren.

da ich ja 1byte pro pixel hab.. char .. heisst das bytes per line müsste 656 sein da ja das format mono8 ist.

bis dann

Verfasst: 8. Juni 2010 20:06
von kater
Im Zweifel ist Bytes per Line so groß wie die Breite des Bildes.

656 is auch ein Vielfaches von 4. Man macht intern den Speicher des Bildes größer, so dass dann die neue Breite ein Vielfaches von 4 ist. Aus Performancegründen. Aber in unserer heutigen Zeit interessiert es wohl niemand mehr.

Verfasst: 9. Juni 2010 08:13
von Curtis Newton
kater hat geschrieben:Im Zweifel ist Bytes per Line so groß wie die Breite des Bildes.

656 is auch ein Vielfaches von 4. Man macht intern den Speicher des Bildes größer, so dass dann die neue Breite ein Vielfaches von 4 ist. Aus Performancegründen. Aber in unserer heutigen Zeit interessiert es wohl niemand mehr.
Bitte? Das interessiert ja wohl, wenn man eine Schleife über das ganze Bild machen willst. Da ist die Unterscheidung width<->pitch essentiell.

C.

Verfasst: 9. Juni 2010 09:53
von kater
Wiso? Wenn ich einmal durchs ganze Bild geh schau ich mir nur das eigentliche Bild an, nicht der aufgefüllte Bereich.