2017-02-24 472 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