从xvfb读取像素数据

3

我发现xvfb有一个奇怪的问题。基本上,我通过xvfb来运行一个应用程序,如下所示:

Xvfb :1 -screen 0 1920x1080x24+32 -fbdir /var/tmp &
export DISPLAY=:1
gimp &

然后我像这样从文件中读取像素数据:

#include <string>
#include <string.h>
#include <thread>
#include <math.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

char *fbp1 = 0;
int fbfd1;
long int screensize1;

int main() {
        fbfd1 = 0;
        screensize1 = 0;
        fbfd1 = open("/var/tmp/Xvfb_screen0", O_RDWR);

        screensize1 = 1920 * 1080 * 4;
        fbp1 = (char*)mmap(0,
              screensize1,
              PROT_READ | PROT_WRITE,
              MAP_SHARED,
              fbfd1,
              0);

        for (int i = 0; i < 1000; i++) {
                cout << ((int*)fbp1)[i] << endl;
        }
        return 0;
}

出现这种情况的原因可能是在打印缓冲区的前1000个元素时,会先打印出一些随机数据,然后再开始打印屏幕上的实际内容。如有疑问,请提出,感谢您的支持!

顺便提一下,我建议测试open()mmap()等函数的返回值。并且记录魔数(例如4是否是你的平台上sizeof(int)的值?为了清晰起见,你可以写成int *fbp1sizeof *fbp1)。 - Toby Speight
1个回答

3
根据这里所述,您的文件不仅仅是像素数组,而是采用xwd格式
您可以在平台特定的xwdfile.h头文件中了解更多有关此格式的信息,并使用例如xwud实用程序源代码,在您之前了解它是如何完成的。

非常感谢!这正是我寻找的! - ktb92677

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接