【问题标题】:How to take screen shot in Linux without X11 or /dev/fb0?如何在没有 X11 或 /dev/fb0 的 Linux 中截屏?
【发布时间】:2014-03-06 17:14:43
【问题描述】:

我正在开发基于 Linux 的嵌入式系统。它使用 Qt 进行窗口化,并且没有 Xserver。我的目标是截取屏幕截图。

我尝试过使用 FBgrab。它失败了,因为我没有/dev/fb0,因为内核中没有启用帧缓冲区。我们正在运行一个基于 Qt 的应用程序来在屏幕上显示 UI (HDMI)。我还尝试了使用 QPixmap 和抓取窗口的 QT 网站中的屏幕截图应用程序。这也是一个失败,因为我无法在系统中运行两个 QAppliction,因为它会影响显示。

还有其他方法可以获取屏幕截图吗?

【问题讨论】:

  • @nos 在设备中,在 /etc/directfbrc 文件中,我们提供了一个备用图形系统(opengl),所以 Qt 不需要 /dev/fb0

标签: c++ linux qt embedded directfb


【解决方案1】:

假设您的视频软件堆栈不是完全自定义的,您的 Linux 视频驱动程序应该是 FBDEV 或 DRI 驱动程序。要检查这一点,我会告诉您在 live 框中搜索 /dev/fb0 文件或 /dev/dri/ 文件夹,但在嵌入式设备中,它们可以轻松重命名为任何内容,因此唯一知道的方法是检查视频设备驱动程序源(如果它们是 FBDEV,您将在 drivers/video/ 中找到它们,如果它们是 DRI,则在 /drivers/gpu/drm 中找到它们)。

如果它们是 FBDEV,那么 /dev/fb0 应该在那里可能有不同的名称。如果它们是 DRI,您仍然可以在构建 Linux 内核时启用 DRM_FBDEV_EMULATION 选项,并拥有一个可以依赖 FBgrab 的 FBDEV 设备节点。

【讨论】:

    【解决方案2】:

    您可以让您的应用程序根据某些事件或命令对其自身进行屏幕截图。为此,您可以将小部件抓取到像素图,然后将此像素图保存在某处。例如:

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

    【讨论】:

    • 感谢您的快速重播。你说的我已经试过了。代码是 ` #include int main(int argc, char **argv) { QApplication app(argc, argv); QWidget *widget = QApplication::activeWindow(); if (widget == NULL){ qWarning()grab(); qWarning() 这里我没有得到一个小部件。它始终为 NULL。
    • 因为我在上面的评论中读到你正在使用 GL,所以使用 QGLWidget::grabFrameBuffer()。
    • 我想从另一个应用程序截取屏幕截图。即主应用程序在屏幕上显示图像。我不想碰这个应用程序。从另一个应用程序中,我想将屏幕 UI 保存到文件中。那可能吗?第二个应用程序不应该在屏幕上绘制任何东西......
    • 您可能想从其他应用程序中使用 QPixmap::grabWindow,但我不能 100% 确定这是否适用于您的情况。 qt-project.org/doc/qt-4.8/qpixmap.html#grabWindow
    • 我试过那个。上面注释中的代码。我在这方面做错了什么吗..
    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 2017-09-15
    • 2019-09-16
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多