raw mono8 grayscale bild in QPicture/Pixmap konvertieren

Alles rund um die Programmierung mit Qt
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

raw mono8 grayscale bild in QPicture/Pixmap konvertieren

Beitrag 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
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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.
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag 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.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

In der Doku stand was von Format_Indexed8 und QImage = Problem. Aber irgendwie geht es schon :)
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag 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
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Mithilfe der Suchfunktion habe ich diesen Thread gefunden.
http://qtforum.de/forum/viewtopic.php?t ... t=indexed8
Das könnte Dir weiterhelfen...
Linux, das längste Text-Adventure aller Zeiten
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag 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.
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag 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
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag 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.
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag 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
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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 );
}
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag 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
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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.
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag 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.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Wiso? Wenn ich einmal durchs ganze Bild geh schau ich mir nur das eigentliche Bild an, nicht der aufgefüllte Bereich.
Antworten