2014-02-09 53 views
8

我正在開發基於Linux的嵌入式系統。它使用Qt進行窗口化,並且沒有Xserver。我的目標是拍攝屏幕截圖。如何在沒有X11或/ dev/fb0的Linux中拍攝屏幕截圖?

我試過使用FBgrab。它失敗了,因爲我沒有/dev/fb0,因爲內核中沒有啓用幀緩衝區。我們正在運行一個基於Qt的應用程序來顯示屏幕上的用戶界面(HDMI)。我也嘗試了使用QPixmap和抓取窗口的QT網站中的屏幕截圖應用程序。這也是一個失敗,因爲我無法在系統中運行兩個QAppliction,因爲它會影響顯示。

有沒有其他的方法來獲得屏幕截圖?

+0

@nos在設備中的/ etc/directfbrc文件中,我們給出了一個可選的圖形系統(opengl),所以Qt不需要/ dev/fb0 – Griffin

回答

1

您可以根據某些事件或命令讓應用程序截取其自身。您可以通過將小部件抓取到像素圖中,然後將該像素圖保存在某處。例如:

QWidget *widget = QApplication::activeWindow(); 
QPixmap pixmap = QPixmap::grabWidget(widget); 
pixmap.save(QString("/path/to/screenshot/screenshot.png")); 
+0

感謝您的快速回放。我已經嘗試過你說過的話。代碼是**'#include int main(int argc,char ** argv) { QApplication app(argc,argv); QWidget * widget = QApplication :: activeWindow(); if(widget == NULL){ qWarning()<<「NULL」; return app.exec(); } QPixmap pixmap = widget-> grab(); qWarning()<< pixmap.save(QString(「./ sample.png」)); qWarning()<<「保存」; return app.exec(); }'** 在這裏,我沒有得到一個小部件。它總是NULL。 – Griffin

+0

因爲我在上面的註釋中讀到了你正在使用GL,所以使用QGLWidget :: grabFrameBuffer()。 – PurpleAlien

+0

我想從另一個應用程序中獲取屏幕截圖。即主應用程序在屏幕上顯示圖像。我不想碰這個應用程序。從另一個應用程序中,我想將屏幕UI保存到一個文件中。那可能嗎?第二個應用程序不應該在屏幕上繪製任何東西... – Griffin

0

假設您的視頻軟件堆棧是不是完全自定義的,你的Linux顯卡驅動應該是一個的fbdev一個或DRI之一。爲了檢查這一點,我會告訴你在你的活箱中搜索/ dev/fb0文件或/ dev/dri /文件夾,但是在嵌入式設備中,它們可以很容易地重命名爲任何內容,所以唯一的方法是檢查視頻設備驅動程序的來源(如果它們是FBDEV,您可以在驅動程序/視頻中找到它們,如果它們是DRI,則可以在/ drivers/gpu/drm中找到它們)。

如果它們是FBDEV,那麼/ dev/fb0應該可能有不同的名稱。如果它們是DRI,則仍然可以在構建Linux內核時啓用DRM_FBDEV_EMULATION選項,並擁有FBgrab可以依賴的FBDEV設備節點。