从Xlib中获取Pixmap

时间:2013-11-11 18:02:34

标签: xlib pixmap

我一直试图找到一种直接从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。

提前感谢您提供的任何帮助。

最好的问候。

1 个答案:

答案 0 :(得分:0)

X世界中的“位图”指的是双色图像。我猜XWriteBitmapFile在内部执行GetImage请求并将服务器像素图转换为位图。请注意,文件格式是它自己的'X11位图',而不是Windows位图。

使用XGetImage函数如果您确实需要图像的二进制blob。