QPixelmap aus Speicher laden

Alles rund um die Programmierung mit Qt
Antworten
december_soul
Beiträge: 17
Registriert: 8. April 2005 18:52

QPixelmap aus Speicher laden

Beitrag von december_soul »

Hallo
Ich würde gernen ein erzeugtest Bild das im Speicher liegt dastellen.

Das ganze liegt als
uint8_t data[width*height];
vor.
Die Werte sind zwischen 0...255 und liegen ohne header vor.
12 32 43 0 0 0 2 23 4
12 33 33 4 4 44 4 44 2
.............

Nun würde ich das ganze natürlich anzeigen lassen.
Am besten nehme ich da ein QPixelmap denke ich.

Ich habe also ein
QLabel mit dem Namen pixMap
und einen Pointer auf mein Bild
frame->data

Nun will ich das dastellen.

Ich habe schon einiges versucht:

Soweit ich das verstehe, sollte es ganz einfach mit folgender Zeile gehen:
pixMap->loadFromData(frame->data, frame->width*frame->height, "PNG",QPixmap::Auto);

Geht natürlich nicht!
Dann bin ich zum Testen mal den umweg über ein neues QPixmap gegangen.

QPixmap* mypixmap;
mypixmap->loadFromData(frame->data, frame->width*frame->height, "PNG",QPixmap::Auto);
pixMap->setPixmap (*mypixmap);

Folge ist auch hier das ich ein leeres Bild angezeigt bekomme.

An einer anderen Stelle schreibe ich das Bild hin und wieder auch mal in eine Datei:

Code: Alles auswählen

        pFile=fopen(szFilename, "wb");

        // Write header  
        fprintf(pFile, "P5 %d %d 255 ",  avf.width, avf.height);

        // Write pixel data
        for(y=0; y<avf.height; y++)
            for (x=0;x<avf.width;x++)
                fwrite(avf.data[0]+y*avf.width+x, sizeof(uint8_t), 1, pFile);

        // Close file
        fclose(pFile);

Das geht ohne Probleme.

Hat jemand einen Tip was ich hier falsch mache?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wieso versuchst du das Bild als PNG zu laden wenn es doch als Byewerte vorliegt? Ohne Header für z.B. ein XPM-Pixmap geht wohl nichts - woher soll Qt auch die Breite, Höhe usw. herholen wenn nicht aus dem Header?
Also XPM-Header erstellen, Daten ins XPM-Format bringen und dann kann es Qt auch laden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
december_soul
Beiträge: 17
Registriert: 8. April 2005 18:52

Beitrag von december_soul »

Habe es nun zum laufen bekommen.
Ich sehe zwar relativ viele artefakte aber das kommt sicher durch das skalieren.

Ausserdem flimmert das Bild stark.
Kann man sowas wie dubbelbuffering einschalten?
Ich was zwar das ein QLable nicht dazu gedacht ist um videos da zu stellen aber was nimmt man sonst?
Kommt hier auch nicht ganz so auf Laufzeit an.
Es muss aber auf jedenfall jedes Frame einzeln übertragen und dagestellt werden.

Code: Alles auswählen

    char buffer[128];
    
    QBuffer *pImageBuffer = new QBuffer();
    pImageBuffer->open(IO_WriteOnly);
    QDataStream *pDataStream = new QDataStream(pImageBuffer);
    
    //header for png    
    sprintf(buffer,"P5 %d %d 255\n",frame->width, frame->height);
    pDataStream->writeRawBytes(buffer,strlen(buffer));
    
    pDataStream->writeRawBytes((char*) frame->data,frame->width*frame->height*sizeof(frame->data[0])); 
    
    pImageBuffer->close();
    pImageBuffer->open(IO_ReadOnly);
    
    QPixmap *pixmap = new QPixmap();
    
    if(pixmap->loadFromData(pImageBuffer->buffer()))
    {
        pixMap->setPixmap(*pixmap);
        pixMap->update();    
    }else{
        printf("failed to construct pixmap\n");    
    }
    
    pImageBuffer->close();
    delete pImageBuffer;
    delete pDataStream;
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

Hallo!

Du könntest es vielleicht mit einem QGLWidget versuchen! Da wird immer alles neugezeichnet.

Ciao
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

es ist schom kommisch, warum man immer wieder versucht, QLabel für die Anzeige von Bildern zu benutzen. Dafür ist es definitiv nicht gedacht!

Schreib dir doch eine Klasse (abgeleitet von QWidget oder QScrollView), die eben ein Bild anzeigt... Das sind im einfachsten Fall zwei zeilen:

QPainter p(this);
p.drawPixmap(myPixmap);

in paintEvent() bzw. viewportPaintEvent()


Für eine optimale Darstellung reicht es nicht aus, aber das wäre doch ein Anfang...
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

lepsai hat geschrieben:p.drawPixmap(myPixmap);
Muss es nicht z.B.

Code: Alles auswählen

p.drawPixmap(0, 0, myPixmap);
heißen?

Ciao
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Scherzkeks. Natürlich heisst es so... Aber ich bin zu faul, alle Aufrufe komplett zu schreiben.... Möge mir das Publikum hier verzeihen!
Antworten