Wie stellt man ein QImage dar?
-
- Beiträge: 30
- Registriert: 6. September 2004 17:12
Wie stellt man ein QImage dar?
Hi,
hab ein Bild in QImage. Wie zeichne ich dieses Bild auf ein Label?
Oder wie kann ich es darstellen?
Gruß und Dank!
hab ein Bild in QImage. Wie zeichne ich dieses Bild auf ein Label?
Oder wie kann ich es darstellen?
Gruß und Dank!
-
- Beiträge: 30
- Registriert: 6. September 2004 17:12
achja, benutzt ein RGB-Bild.
Folgender Aufruf funktioniert leider nicht!
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));
-
- Beiträge: 30
- Registriert: 6. September 2004 17:12
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]
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);
}
nicht vergessen:
QImage-Doku:
Note that yourdata must be 32-bit aligned.
oder du probierst eine langsame aber sichere Variante:
aber wie schon in einem anderen Thread erwähnt, wird sowieso nicht akzeptabel laufen wegen flackern.
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.
-
- Beiträge: 30
- Registriert: 6. September 2004 17:12
habe hilfe bekommen, die haben mir folgendes empfohlen:
Das Bild läuft doch recht flüssig.
Wie kommt man an noch etwas mehr Performance?
Soll irgendwann mal in 'Echtzeit' laufen!
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);
Wie kommt man an noch etwas mehr Performance?
Soll irgendwann mal in 'Echtzeit' laufen!
-
- Beiträge: 30
- Registriert: 6. September 2004 17:12
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...
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...
-
- Beiträge: 30
- Registriert: 6. September 2004 17:12