QImage mit Daten direkt aus dem Speicher füllen

Alles rund um die Programmierung mit Qt
Antworten
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

QImage mit Daten direkt aus dem Speicher füllen

Beitrag von sacrif »

Hi,

ich habe die Daten für ein gerendertes Bild im Speicher liegen und möchte diese nun in ein QImage kopieren.

Dazu habe ich zunächst mal das QImage mit dem gewünschten format und den gewünschten dimensionen erstellt:

Code: Alles auswählen

QImage* currentImage = new QImage(renderedData->size[0], renderedData->size[1], QImage::Format_ARGB32);
Und nun wollte ich die daten aus dem Speicher in das QImage mittels memcpy kopieren.

Code: Alles auswählen

memcpy((void*)currentImage->data_ptr(), (void*)renderedData->getBuffer(), renderedData->getBytes());
Allerdings kommt dabei eine segfault wenn wenn memcpy aufgerufen wird.

Meine frage dabei ist, kann es sein das das Probelm daran liegt, dass ich die Daten nicht einfach so in einer linie kopieren kann? Also wie ist das QImage im Speicher angelegt? Oder kann ich immer nur eine gewisse Anzahl von bytes auf einmal kopieren weil der QImage speicher 2 dimensional ist.
Und muss ich noch irgendwie vorher Speicher allokieren? Oder sollte dass mit dem initialisieren von QImage wie ich es getan habe erledigt sein?
Oder gibts noch andere Ideen wie das ausschaun sollte?

Danke & lg
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Woher hast Du denn data_ptr()? Nimm bits(). Und Du solltest mal überlegen, wann der Pitch ungleich der Breite des Bildes ist.

C.
sacrif
Beiträge: 40
Registriert: 22. Januar 2010 18:52

Beitrag von sacrif »

data_ptr war schon da - offensichtlich von QImage zur verfügung gestellt ;)
Meinst du 1 pitch sollte einer Linie im bild entsprechen? Oder wie meinst du das jetzt?

Ich habs jetzt daweil anders gelöst über einen der zahlreichen Konstruktoren die QImage zur verfügung stellt - falls es mal wer brauchen sollte:

Code: Alles auswählen

QImage* currentImage = new Image((uchar*)renderedData->getBuffer(),
											  renderedData->size[0],				// renderedData->getSize()
											  renderedData->size[1],				// 1
											  renderedData->getPitch(),			//bytes per line (row)
											  QImage::Format_ARGB32);
Würd mich aber dennoch interessieren wie das Ganze über des memcpy genau funktioniert falls da noch wer genauer Informationen hat.
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Die Breite eines Bildes in bytes muss nicht der Breite des Bildes in Pixeln entsprechen:

"The scanline data is aligned on a 32-bit boundary."

C.
Antworten