Wie stellt man ein QImage dar?

Alles rund um die Programmierung mit Qt
Antworten
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Wie stellt man ein QImage dar?

Beitrag von littlepeoplegirl79 »

Hi,

hab ein Bild in QImage. Wie zeichne ich dieses Bild auf ein Label?
Oder wie kann ich es darstellen?

Gruß und Dank!
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Beitrag von littlepeoplegirl79 »

achja, benutzt ein RGB-Bild.
Folgender Aufruf funktioniert leider nicht!

Code: Alles auswählen

qlabel_videoplane->setPixmap( QPixmap::convertFromImage (QImage::QImage( (uchar*)frame_data, frame_xsize, frame_ysize, frame_depth, 0, frame_depth, QImage::LittleEndian ), 1));
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

bin mir jetzt nicht sicher, aber ich glaub convertFromImage ist nicht statisch.

Geht vielleicht sowas?

QImage image; <- Dein QImage

QPixmap myPixmap;
myPixmap.convertFromImage(image);
qlabel_videoplane->setPixmap(myPixmap);

Gruß

Mike
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Beitrag von littlepeoplegirl79 »

Dieser Ansatz entschäfrt ersteinmal die Fehler.
Jedoch bekomme ich nur ein Schwarzer Bild, mit dem Hinweis
das QImage::smoothScale ein null image ist?

Jedoch gebe ich mir die RGB-Werte aus und da sind definitive Farbwerte vorhanden.

Code: Alles auswählen

im Header:

QImage*	qimage;
QPixmap qpixmap;

Code: Alles auswählen

buffersize = m_frameGrabber.GetBufferSize();
frame_depth = (buffersize/(frame_xsize*frame_ysize));

/* grab a video frame */
if(GRAB_32BIT == 0) {
	m_frameGrabber.GrabFrame();
}
else {
	m_frameGrabber.Grab32BitFrame();
}

if( (dataPtr = (unsigned char*)m_frameGrabber.GetBuffer()) == NULL ) {
	arUtilSleep(2);
	return;
}

printf("Adresse s: %p\n", &dataPtr);
printf("Groesse : %i\n", sizeof(dataPtr));
printf("Groesse des Buffers: %i\n", buffersize);
printf("R-Wert des Zeigers : %i\n", dataPtr[0]);
printf("G-Wert des Zeigers : %i\n", dataPtr[1]);
printf("B-Wert des Zeigers : %i\n", dataPtr[2]);
printf("A-Wert des Zeigers : %i\n", dataPtr[3]);
printf("Breite des Frames  : %i\n", frame_xsize);
printf("Hoehe des Frames   : %i\n", frame_ysize);
printf("Tiefe des Frames   : %i\n", frame_depth);

if(dataPtr!=0)
{
qpixmap.convertFromImage(QImage::QImage( (uchar*)dataPtr, frame_xsize, frame_ysize, frame_depth, 0, frame_depth, QImage::IgnoreEndian ));
videoplane->setPixmap(qpixmap); 
}
[/code]
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

nicht vergessen:

QImage-Doku:
Note that yourdata must be 32-bit aligned.

oder du probierst eine langsame aber sichere Variante:

Code: Alles auswählen

QImage img(frame_xsize, frame_ysize,32);
// übrigens geile Bezeichner :)

for(int x = 0; x < frame_xsize; x++)
for(int y = 0; y < frame_ysize; y++)
img.setPixel( x,y, qRgba(r,g,b,a) ), wobei r,g,b,a - deine Werte an (x,y)sind.
aber wie schon in einem anderen Thread erwähnt, wird sowieso nicht akzeptabel laufen wegen flackern.
john
Beiträge: 110
Registriert: 14. August 2004 20:55
Wohnort: München

Beitrag von john »

>aber wie schon in einem anderen Thread erwähnt, wird sowieso nicht akzeptabel laufen wegen flackern.

um das Flackern zu verhindern, gibt es die Möglichkeit von "Doubble-Buffering".

Grüße John
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Beitrag von littlepeoplegirl79 »

habe hilfe bekommen, die haben mir folgendes empfohlen:

Code: Alles auswählen


QImage img(frame_xsize, frame_ysize, 32, 0); // Qt kann keine 24 Bit

			int idx = 0;
			for (int i = 0; i < frame_ysize; ++i) {
				QRgb *line = (QRgb*)img.scanLine(i);

				for (int j = 0; j < frame_xsize; ++j) {
				line[j] = qRgba(dataPtr[idx + 2], dataPtr[idx + 1], dataPtr[idx], dataPtr[idx + 3]);
				idx += 4; // für RGBA hier += 4
				}
			}

			// die Nullen sind die Offsets von der oberen/linken Ecke des Widgets aus
			bitBlt(videoplane, 0, 0, &img);
Das Bild läuft doch recht flüssig.
Wie kommt man an noch etwas mehr Performance?
Soll irgendwann mal in 'Echtzeit' laufen!
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

na wie schnell läuft's denn in frame/sec?
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Beitrag von littlepeoplegirl79 »

bei fullscreen, um die 15fps!

Bei 640x480 auf einem PIII-1GHz
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

na ja, das ist gar nicht so übel. besser wirds nicht, da die Konvertierung deines Bildes in QImage oder QPixmap immer notwendig sein wird.
das Zeichnen mit bitBlt() ist schon die schnellste Variante.

rein theoretisch könntest du die Konvertierung deines Bildes in Qimage beschleunigen durch direkteres Kopieren (vorausgesetzt du hast ein 32bit Bild):

Qimage img(w,h,32);

unsigned char * p = img.scanline(0);
memcpy(p,myImg,w*h*4);

dann dürftest du aber nicht mit Kanälen arbeiten, sondern die RGB-Werte auch in ein Integer-Array schreiben.

vielleicht geht's...
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Beitrag von littlepeoplegirl79 »

danke, werd ich probieren.
Antworten