我想获得屏幕或窗口的屏幕截图。我尝试使用从X11 功能,它工作正常。问题是从XImage获取像素需要很多时间。 比我试图寻找一些如何使用OpenGL做到这一点的答案。这里就是我的了:截图使用openGL和/或X11
#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,根,GLC); glc = glXCreateContext(dpy,vi,NULL,GL_TRUE);它不返回任何错误,但所有像素都为0.
我该如何解决这个问题?我是新来的OpenGL,也许我错过了重要的东西在这里。也许另一种从屏幕或特定窗口获取像素的方式存在?
是什么让你的事情,使用GL将使它更快吗?它应该是一样的。 – 2011-05-19 19:02:11
需要多少时间?是否涉及网络传输?你只是在终端观看标准输出吗?尝试重定向到一个文件并使用'time'命令。将字符打印到终端使用的是同一台X服务器,这些服务器拼命尝试复制图像并通过协议进行编组。海森堡可以申请;您的检测技术可能会扭曲您寻求的信息。 – 2011-07-17 10:44:23