Seite 1 von 1
Print eines OpenGL Fensters
Verfasst: 6. Mai 2009 11:14
von Klausn
Hi zusammen,
ich möchte den Inhalt eines OpenGL Fensters ausdrucken. Ich habe mittlerweile folgende Funktion zusammengebastelt aber leider kommt beim Drucken nichts an. Weiss jemand woran das liegt !?
QPrinter printer(QPrinter::HighResolution);
printer.setup(this);
QPainter painter(&printer);
QRect rect = painter.viewport();
QImage image;
QSize size = image.size();
size.scale(rect.size(), QSize::ScaleMin);
painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
painter.setWindow(image.rect());
painter.drawImage(0, 0, image);
Irgendwo muss doch auch die Zuweisung des OpenGL Fensters gemacht werden... das bei mir überigens "viewport2" heisst.
Bin für Hilfe sehr dankbar
MfG
klausn
Verfasst: 6. Mai 2009 11:43
von Klausn
So,
ich habe meine Screenshot Funktion und meine Druckfunktion (Drucken des Screenshots) einfach zusammengefügt. Und nun kommt auch hinten was raus.
QPrinter printer(QPrinter::HighResolution);
printer.newPage();
printer.setup(this);
QPainter painter(&printer);
QRect rect = painter.viewport();
QWidget* w = viewport2; //nur OpenGL Fenster
QPixmap snapshot = QPixmap::grabWindow(w->winId(), 0, 0, -1, -1);
painter.drawPixmap(0,0,snapshot);
Die Sache hat nur einen Haken ... durch die Öffnung des Druckdialoges wird ein Teil vom OpenGL Bild überdeckt. Das ist natürlich beim Druckbild auch so. Wie kann man das beheben ???
Also wie macht man z.B. einen Screenshot, nur vom Inhalt eines Fensters .. ohne das z.B. davor liegende Fenster mit aufgenommen werden ????
danke schonmal
es handelt sich um qt 3.3.3
Verfasst: 6. Mai 2009 13:39
von Klausn
Hmmm .. mit dem folgenden gehts leider auch nicht ... da kommt nur ein graues Bild Bild bei raus.
QPixmap snapshot = QPixmap::grabWidget(viewport2, 0, 0, -1, -1);
Verfasst: 6. Mai 2009 13:46
von franzf
"OpenGL-Fenster" ist ein QGLWidget?
Das kennt auch ein renderPixmap().
Ansonsten (schneller) mittels eines QGLPixelBuffers.
Verfasst: 6. Mai 2009 14:20
von Klausn
renderPixmap() funktioniert leider auch nicht .. da bekomme ich nur ein komplett schwarzes bild.
Verfasst: 6. Mai 2009 16:11
von solarix
Die Sache hat nur einen Haken ... durch die Öffnung des Druckdialoges wird ein Teil vom OpenGL Bild überdeckt. Das ist natürlich beim Druckbild auch so.
Was ja auch dokumentiert ist:
The grabWindow() function grabs pixels from the screen, not from the window, i.e. if there is another window partially or entirely over the one you grab, you get pixels from the overlying window, too
Wie kann man das beheben ???
in dem man grabWindow _vor_ dem Druckerdialog aufruft, oder gleich das Widget (grabWidget(myPointerToSeOpenGlWidget)) nimmt?
Verfasst: 7. Mai 2009 10:57
von Klausn
hab jetzt alles ausprobiert...
grabwindow, grabwidget, grabframebuffer, renderpixmap
funktioniert alles nicht. Da kommt immer ein schwarzes oder ein graues Bild raus.
Das einzige was funktioniert ist grabwindow , wenn ich es vor dem Druckerdialog ausführe.
QGLWidget bla;
QPixmap snapshot = bla.grabFrameBuffer(true);
snapshot.save("screenshot.png", "PNG", 100);
hierbei wird ein komplett schwarzes Bild ausgegeben, das allerdings die richtigen Maße hat.
Verfasst: 7. Mai 2009 11:12
von franzf
Schau dir mal mal das grabber-example an:
4.5.0/examples/opengl/grabber
Wenn du absolut nicht weiter kommst, kannst du dein projekt in ein Zip packen und hier anhängen, oder irgendwo hochladen und hier nen Link posten (damit es die Leute auch ausprobieren wollen).
Grüße
Franz