Print eines OpenGL Fensters

Alles rund um die Programmierung mit Qt
Antworten
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 10:40

Print eines OpenGL Fensters

Beitrag 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
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 10:40

Beitrag 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
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 10:40

Beitrag 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);
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

"OpenGL-Fenster" ist ein QGLWidget?
Das kennt auch ein renderPixmap().
Ansonsten (schneller) mittels eines QGLPixelBuffers.
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 10:40

Beitrag von Klausn »

renderPixmap() funktioniert leider auch nicht .. da bekomme ich nur ein komplett schwarzes bild.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
Klausn
Beiträge: 48
Registriert: 28. Januar 2009 10:40

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Antworten