我们使用 EGLFS 在没有 X 服务器的嵌入式 Linux 设备上运行 QML 应用程序。所以我不能使用通常的技术来获取屏幕截图(例如使用屏幕截图实用程序)。在这个问题中,我找到了使用QQuickView::grabWindow()
.
我的问题:这个函数的结果是否保证与用户在屏幕上看到的完全一致?我担心要获取窗口内容,Qt 可能必须使用不同的代码路径(例如渲染到纹理)重新渲染窗口,这可能会导致结果不同。
我也希望您的答案中包含可靠的参考。
据我所知,屏幕截图不会完全相同。遵循QQuickWindow::grabWindow中的代码:它最终调用qt_gl_read_framebuffer
,它总是将图像读取为 RGB(A)8。您的实际帧缓冲区可能不同(例如,它可能是 RGB565)。
(我似乎还记得不能通过glReadPixels
RGB565 帧缓冲区使用 RGBA 读取,但我不是 100% 确定在所有 OpenGL 版本/变体中都是如此......)
根据您的驱动程序,解决方法可能是读取/dev/fb0
内容。无论如何,如果您需要此功能,请提交错误报告。