我一直试图从X窗口直接抓取视频,并指向Xlib和复合扩展。
到目前为止,我已经能够侦听更改事件并使用以下代码获取Pixmap:
#include <X11/Intrinsic.h>
#include <X11/extensions/Xcomposite.h>
#include <X11/extensions/Xdamage.h>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char ** argv) {
int br, base;
Window win = 0x3400003;
Display *dsp = XOpenDisplay(0);
XCompositeQueryExtension(dsp, &base, &br);
XDamageQueryExtension(dsp,&base, &br);
cout << base << endl;
Damage damage = XDamageCreate(dsp, win, XDamageReportRawRectangles);
XCompositeRedirectWindow(dsp, win, CompositeRedirectAutomatic);
XEvent ev;
while(true) {
XNextEvent(dsp, &ev);
if(ev.type == base + XDamageNotify) {
Pixmap pm = XCompositeNameWindowPixmap(dsp, win);
XWindowAttributes attr;
XGetWindowAttributes(dsp, win, &attr);
XWriteBitmapFile(dsp, "test.bmp", pm, attr.width, attr.height, -1, -1);
return 0;
}
}
XCompositeUnredirectWindow(dsp, win, CompositeRedirectAutomatic);
XDamageDestroy(dsp, damage);
return 0;
}这里的问题是,由此产生的bmp (由XWriteBitmapFile创建)是黑白可怕的。不管我不想把数据写进文件的事实,我显然是在做一些错误的阅读。我希望将Pixmap转换为opengl中的框架缓冲区或ram中的二进制blob。
谢谢你在这件事上给我的任何帮助。
诚挚的问候。
发布于 2013-11-11 22:24:40
X世界中的“位图”指的是双色图像。我猜XWriteBitmapFile在内部执行GetImage请求,并将服务器像素映射转换为位图。请注意,文件格式是自己的“X11位图”,而不是windows位图。
如果您确实需要图像的二进制blob,可以使用XGetImage函数。
https://stackoverflow.com/questions/19912851
复制相似问题