Seite 1 von 1

Wie stellt man ein QImage dar?

Verfasst: 14. September 2004 07:50
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!

Verfasst: 14. September 2004 08:53
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));

Verfasst: 14. September 2004 10:48
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

Verfasst: 14. September 2004 12:14
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]

Verfasst: 15. September 2004 09:56
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.

Verfasst: 15. September 2004 10:14
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

Verfasst: 15. September 2004 10:45
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!

Verfasst: 15. September 2004 11:02
von lepsai
na wie schnell läuft's denn in frame/sec?

Verfasst: 15. September 2004 11:17
von littlepeoplegirl79
bei fullscreen, um die 15fps!

Bei 640x480 auf einem PIII-1GHz

Verfasst: 15. September 2004 11:36
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...

Verfasst: 15. September 2004 11:45
von littlepeoplegirl79
danke, werd ich probieren.