Есть ли способ прочитать содержимое фреймбуфера в Qt или, во всяком случае, в C? Я читал, что можно записать содержимое /dev/fb0 в файл, а затем загрузить его. Но можно ли не сохранять его в памяти и просто скопировать в новую ячейку памяти для использования в Qt? Спасибо!
Как мне прочитать изображение, которое сейчас находится в буфере кадра в Qt/C?
Ответы (2)
Обычный дистрибутив Qt вряд ли будет иметь специальную поддержку чтения фреймбуфера в Linux. Он накладывается поверх X11 и пытается обеспечить кроссплатформенность (поскольку такие вещи, как /dev/fb0
, например, не будут иметь значения в Windows). Таким образом, вы должны использовать абстракции более высокого уровня, такие как QPixmap::grabWindow() на что указывает @BerkDemirkir ... вероятно, много переходов между слоями перед кадровым буфером.
(Примечание: если вы пишете обычное кросс-платформенное приложение Qt, предназначенное для работы в оконной среде, это, безусловно, тот путь, по которому вы пойдете для простой задачи захвата экрана!!)
С другой стороны, Qt/Embedded предназначен для Linux и для работы с QWS вместо X11. Мысль такова, что оконной системы нет, и ваше приложение владеет всем экраном. Он записывает напрямую в фреймбуфер через объект QScreen
, у которого есть метод base()
, который фактически может дать вам указатель на базовую память:
http://doc.qt.nokia.com/4.7-snapshot/qscreen.html#base
Это, вероятно, единственные способы "Qt" делать такие вещи. Если вам нужен API вместо того, чтобы напрямую обращаться к /dev/fb0
, вы можете исследовать что-то вроде EZFB. (Я не копал достаточно глубоко, чтобы узнать, полезно это или нет, просто нашел его с запросом вроде «linux framebuffer API»)
http://freshmeat.net/projects/ezfb/
grabWindow()
, вы не сможете с уверенностью сказать, что захватываете устройство фреймбуфера, которое показывается пользователю. Вероятно, X-сервер должен решить, что вам дать, в переводе с точки зрения его виртуализированного дисплея. В большинстве случаев это просто фреймбуфер. Но, например: это может быть виртуальный экран, намного больший, чем физический дисплей. Опять же, это все предположения, мои знания в основном исходят из старого оцепенения C-64 или ModeX. :)
- person HostileFork says dont trust SE; 19.08.2011
Вы можете посмотреть этот пример, чтобы сделать скриншот из любое окно (даже рабочий стол). В примере используется функция QScreen::grabWindow()
для создания снимка экрана.
toImage()
...? doc.qt.nokia.com/4.7-snapshot/qglframebufferobject.html# к изображению - person HostileFork says dont trust SE   schedule 18.08.2011