如何在Linux上进行屏幕截图,而无需X11或/dev/fb0?

8
我正在处理基于Linux的嵌入式系统。它使用Qt进行窗口管理,但没有Xserver。我的目标是对屏幕截图。
我尝试过使用FBgrab,但失败了,因为我没有/dev/fb0文件,因为内核中未启用帧缓冲。我们运行了一个基于Qt的应用程序来显示UI(HDMI)在屏幕上。我还尝试了QT网站上使用QPixmap和grab window的屏幕截图应用程序。这也是失败的,因为我不能在系统中同时运行两个QAppliction,因为它会影响显示。
有其他方法获取屏幕截图吗?

在设备中,我们在/etc/directfbrc文件中提供了一个替代的图形系统(opengl),因此Qt不需要/dev/fb0。 - jsaji
2个回答

1
你可以让应用程序在某个事件或命令的触发下对自身进行截屏。方法是将小部件转换为像素图,然后将该像素图保存到某个位置。例如:
QWidget *widget = QApplication::activeWindow();
QPixmap pixmap = QPixmap::grabWidget(widget);
pixmap.save(QString("/path/to/screenshot/screenshot.png"));

谢谢您的快速回复。我已经尝试了您所说的。代码如下:**`#include <QtWidgets> 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()<<"Saved"; return app.exec(); }`** 在这里,我无法获取窗口小部件。它始终为NULL。 - jsaji
由于我在上面的评论中看到你正在使用GL,请使用QGLWidget :: grabFrameBuffer()函数。 - PurpleAlien
我想从另一个应用程序中进行屏幕截图。即主应用程序在屏幕上显示图像。我不想触摸此应用程序。我想从另一个应用程序将屏幕 UI 保存到文件中。这是否可能?第二个应用程序不应该在屏幕上绘制任何东西... - jsaji
你可能想要使用来自其他应用程序的QPixmap :: grabWindow,但我不能百分之百确定这在你的情况下是否有效。 http://qt-project.org/doc/qt-4.8/qpixmap.html#grabWindow - PurpleAlien
没有看到你的代码和系统运行情况,很难说为什么在你的情况下它不起作用... 你还能分享更多信息吗? - PurpleAlien
显示剩余2条评论

0

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

如果它们是FBDEV,则/dev/fb0可能会以不同的名称出现。如果它们是DRI,则仍然可以在构建Linux内核时启用DRM_FBDEV_EMULATION选项,并使用FBgrab依赖于的FBDEV设备节点。


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