Ich versuche, einen Screenshot des Bildschirms oder eines Fensters zu machen. Ich habe es mit Funktionen von X11 versucht und es funktioniert gut. Das Problem ist, dass das Abrufen der Pixel von XImage eine Menge Zeit in Anspruch nimmt. Dann habe ich versucht, einige Antworten zu finden, wie man es mit OpenGL machen kann. Hier ist, was ich bekommen habe:
#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <X11/Xlib.h>
int main(int argc, char **argv)
{
int width=1200;
int height=800;
//_____________________________----
Display *dpy;
Window root;
GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
XVisualInfo *vi;
GLXContext glc;
dpy = XOpenDisplay(NULL);
if ( !dpy ) {
printf("\n\tcannot connect to X server\n\n");
exit(0);
}
root = DefaultRootWindow(dpy);
vi = glXChooseVisual(dpy, 0, att);
if (!vi) {
printf("\n\tno appropriate visual found\n\n");
exit(0);
}
glXMakeCurrent(dpy, root, glc);
glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
printf("vendor: %s\n", (const char*)glGetString(GL_VENDOR));
//____________________________________________
glXMakeCurrent(dpy, root, glc);
glEnable(GL_DEPTH_TEST);
GLubyte* pixelBuffer = new GLubyte[sizeof(GLubyte)*width*height*3*3];
glReadBuffer(GL_FRONT);
GLint ReadBuffer;
glGetIntegerv(GL_READ_BUFFER,&ReadBuffer);
glPixelStorei(GL_READ_BUFFER,GL_RGB);
GLint PackAlignment;
glGetIntegerv(GL_PACK_ALIGNMENT,&PackAlignment);
glPixelStorei(GL_PACK_ALIGNMENT,1);
glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_INT, pixelBuffer);
int i;
for (i=0;i<100;i++) printf("%u\n",((unsigned int *)pixelBuffer)[i]);
return 0;
}
Wenn ich das Programm ausführe, dann X Error of failed request: BadAccess (Zugriffsversuch auf private Ressource verweigert) Haupt-Opcode der fehlgeschlagenen Anfrage: 199 () Minor o Laufende Nummer der fehlgeschlagenen Anforderung: 20 Aktuelle Seriennummer im Ausgabestrom: 20
wenn ich die Zeile mit glXMakeCurrent(dpy, Root, glc); before glc = glXCreateContext(dpy, vi, NULL, GL_TRUE); auskommentiere, gibt es keine Fehler, aber alle Pixel sind 0.
Wie sollte ich dieses Problem angehen? Ich bin neu in openGL und vielleicht übersehe ich etwas wichtiges hier. Vielleicht gibt es auch einen anderen Weg, um Pixel vom Bildschirm oder einem bestimmten Fenster zu erhalten?