2017-02-24 478 views
0

我想捕获我的Linux PC上的屏幕截图。汇编代码是好的,但如果我试图执行它,它不断抛出同样的错误如下:X11 XGetImage BadMatch错误(无效参数属性)

X Error of failed request: BadMatch (invalid parameter attributes) 
    Major opcode of failed request: 73 (X_GetImage) 
    Serial number of failed request: 7 
    Current serial number in output stream: 7 

任何人可以帮助我弄清楚是什么问题?

下面的代码:

#include <opencv2/opencv.hpp> 
#include <opencv2/highgui.hpp> 
#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

using namespace cv; 

int main() 
{ 
    Display* d = XOpenDisplay(nullptr); 
    auto root = DefaultRootWindow(d); 

    auto img = XGetImage(d, root, 0, 0, 1000, 1000, AllPlanes, ZPixmap); 
    auto rimg = Mat(1000, 1000, CV_8UC4, img->data); 
    imshow("test image", rimg); 
    waitKey(0); 

    return 0; 
} 
+0

是您的显示环境变量设置过吗?如果是,请尝试使用NULL而不是nullptr – cup

+0

我没有碰到任何其他的东西。而NULL不起作用。 –

+0

如果XOpenDisplay的参数是NULL或nullptr,它将使用DISPLAY环境变量的值。如果你的DISPLAY环境变量没有设置,那么它会给你错误。 – cup

回答

0

https://tronche.com/gui/x/xlib/graphics/XGetImage.html

BadMatch一个InputOnly窗口被用作可绘制。

BadMatch某些参数或参数对具有正确的类型和范围,但无法以请求所需的某种其他方式进行匹配。

您需要在获取图像之前先映射窗口。使用

XMapRaised(d, root); 

调用XGetImage

+0

仍然不起作用。这是我得到的错误:'X错误请求失败:BadMatch(无效参数属性) 失败请求的主要操作码:73(X_GetImage) 失败请求的序列号:9 输出流中的当前序列号:9 ' –

+0

您的显示器尺寸是多少?它至少是1000x1000或更小?如果显示器小于1000x1000,将会出现此错误。 – cup

+0

如果它小于1000x1000请将XGetImage的宽度和高度参数更改为您的屏幕大小 – cup