Я пытаюсь получить скриншот экрана или окна. Я пытался использовать функции из X11
и работает нормально. Проблема в том, что получение пикселей из XImage занимает много времени.
Затем я попытался найти ответы на некоторые вопросы о том, как это сделать с помощью openGL. Вот что у меня есть:
#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;
}
когда я запускаю программу, она возвращает ошибку:
X Ошибка неудавшегося запроса: BadAccess (попытка доступа к частному ресурсу отклонена)
Главный код операции невыполненного запроса: 199 ()
Незначительный код операции для неудавшегося запроса: 26
Серийный номер неудавшегося запроса: 20
Текущий серийный номер в выходном потоке: 20
если я закомментирую строку с glXMakeCurrent (dpy, root, glc); before glc = glXCreateContext (dpy, vi, NULL, GL_TRUE); он не возвращает ошибок, но все пиксели равны 0.
Как мне решить эту проблему? Я новичок в openGL и, возможно, мне здесь не хватает чего-то важного. Может быть, существует другой способ получения пикселей с экрана или определенного окна?