2011-08-18 19 views
1

有没有什么办法可以读取Qt中的framebuffer或C中的内容?我读过可以将/ dev/fb0的内容写入文件,然后加载它。但有可能避免将其保存到内存中,并简单地复制到Qt中使用的新内存位置? 谢谢!如何读取Qt/C中framebuffer上的图像?

+0

想必你在谈论访问某种程度低Qt嵌入式与“framebuffer”的* linux *概念的截图,以及**不**谈论Qt的实际framebuffer *类*的OpenGL ...它只是有一个'toImage()'方法...? http://doc.qt.nokia.com/4.7-snapshot/qglframebufferobject.html#toImage – HostileFork

+0

我从来没有见过这个类......看起来很有趣:-)无论如何,我想采取“低级别的截图” ,而不管绘制到帧缓冲区的内容。我已经看到一些有趣的结构在framebuffer头文件中,但我无法在任何地方找到有关这些信息的信息。 –

+1

如果你想要那么低的水平,你可能想看看似乎在这里的fbgrab源代码:http://hem.bredband.net/gmogmo/fbgrab/。 – Torp

回答

3

普通的Qt发行版不太可能在Linux上读取framebuffer特别支持。它位于X11的顶层,并试图提供跨平台功能(例如,像/dev/fb0在Windows上不会有意义)。所以你可以使用更高层次的抽象,比如@BerkDemirkir指出的QPixmap::grabWindow() ......可能在帧缓冲区之前通过层进行很多跳跃。

(注:如果你正在写意图在窗口环境中运行一个普通的跨平台的Qt应用程序,那肯定是你想要去一个简单的屏幕捕获任务!!路线)

在另一方面,Qt/Embedded是为Linux设计的,并且与QWS而不是X11一起使用。心态是,没有窗口系统,你的应用程序拥有整个屏幕。

http://doc.qt.nokia.com/4.7-snapshot/qscreen.html#base

这些都可能是唯一“的Qt”的方法来做到这些类型的:它直接通过QScreen对象,其中有一个base()方法,实际上可以给你一个指向底层内存写入到帧缓冲东西的。如果你想要一个API,而不是直接通过/dev/fb0,你可能会调查类似EZFB的东西。 (我没有深挖不够了解,如果它有没有用,只是发现它与查询类似“Linux的帧缓冲API”)

http://freshmeat.net/projects/ezfb/

+0

只是为了澄清,我的问题只是为了获得帧缓冲的一个镜头。任何方式都适合我,都使用Qt或简单的C/C++。我采用的解决方案是使用QApplication :: desktopWidget()方法和建议的QPixmap :: grabWindow()。我不确切知道这些类是如何工作的,但它似乎正在做我所需要的。这是非常意想不到的,因为我使用OpenGL/EGL和QWS以及我自定义的QScreen实现写入屏幕。同样的方法在Qt/Embedded和QT/X11下都可以使用。无论如何,直接使用fb知道如何做这件事可能会很有趣。谢谢! –

+0

从这里直觉上讲,我可能是错的,但是:如果你通过'grabWindow()',你不能确定你正在抓取显示给用户的帧缓冲设备。X服务器可能会根据其虚拟化显示来决定要提供什么内容。大部分时间只是帧缓冲。但是,举例来说:它可能会实现比物理显示大得多的虚拟屏幕。这也是所有的猜测,我的知识主要来自C-64或ModeX的古老发型。 :) – HostileFork

+0

我对Qt/X11会发生什么感兴趣。这很有趣,同时考虑到OpenGL/EGL也被抓住了。 –