截图使用openGL和/或X11

Jak*_*aka 8 c x11 opengl

我正在尝试获取屏幕或窗口的屏幕截图.我尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序时它返回一个错误:X请求失败的错误:BadAccess(尝试访问私有资源被拒绝)失败请求的主要操作码:199()失败请求的次要操作码:26失败请求的序列号:20当前序列输出流中的数字:20

如果我用glXMakeCurrent(dpy,root,glc)评论该行; 在glc = glXCreateContext之前(dpy,vi,NULL,GL_TRUE); 它不返回错误,但所有像素都是0.

我应该怎么解决这个问题?我是openGL的新手,也许我在这里缺少一些重要的东西.也许还有另一种从屏幕或特定窗口获取像素的方法?

Pio*_*zmo 7

我不认为你想要做的事情是可能的.您不能使用OpenGL从您不拥有的窗口读取像素,甚至可能不使用OpenGL.你需要坚持使用X11.

如果你有,XImage你可以从中获得原始像素ximage->data.只需确保您以正确的格式阅读它.

http://tronche.com/gui/x/xlib/graphics/images.html