Java 屏幕捕获 OpenGL 和 DirectX 全屏应用程序

Posted

技术标签:

【中文标题】Java 屏幕捕获 OpenGL 和 DirectX 全屏应用程序【英文标题】:Java Screen Capture OpenGL and DirectX fullscreen Applications 【发布时间】:2014-07-22 23:22:47 【问题描述】:

我正在尝试在 java 中设计一个程序来定期(每 100 毫秒左右)对我的显示器进行屏幕截图并计算整个屏幕的平均像素 rgb 值。我需要它才能处理视频游戏和 iTunes/Quicktime 视频。但是,我尝试使用 JNA 和机器人来捕获屏幕,它仅在我没有全屏捕获视频游戏或 iTunes 视频时才有效。例如,我通过保存图像来测试我的代码以检查并查看发生了什么。当我玩电子游戏时,我只看到一个空白窗口的屏幕截图。我认为这是因为游戏使用的是 directx 或 openGL,并且与硬件的通信方式与您的典型应用程序不同。

如果我使用 this 方法而不是机器人或 JNA 来捕获屏幕截图,这会解决我的问题吗?看起来它正在从 openGL 屏幕缓冲区复制数据。 DirectX 应用程序呢?

我基本上只是希望能够随时在屏幕上获取感知到的像素数据。不管它是否是全屏 DirectX 或 OpenGL 应用程序。在此先感谢您的帮助。

【问题讨论】:

lwjgl 方法只会截屏 lwjgl 显示。即,如果您使用 lwjgl 创建了一个应用程序并想要截取其内容,那么它将起作用,但它不会像您想要的那样捕获整个屏幕 【参考方案1】:

我猜这是针对 amBX 照明系统的自制版本。即使不是,以下页面也可能对您有所帮助;它包含用于 DIY 环境照明设置的 java 代码和 arduino 代码,需要完成同样的事情:

http://siliconrepublic.blogspot.com/2011/02/arduino-based-pc-ambient-lighting.html

需要考虑的事项: 1. 出于处理速度的原因,该代码示例故意忽略了屏幕上的一些像素 2. 根据您显示的内容(赛车游戏与第一人称射击游戏与自上而下的策略或 MOBA 游戏与电影),您可能需要有意将显示分割成单独的部分。例如,对于赛车游戏,您可能希望左侧和右侧都更加独立并且对快速变化非常敏感,而对于一般的电影观看,您可能需要更一般的输出,因为您正在处理更广泛的方式相机可以移动。

【讨论】:

是的,我将它用于环境照明系统!不错的猜测!尽管这个人的做法与我已经在做的完全一样。他正在使用机器人类来创建屏幕截图。当我这样做时,它可以工作,但它不适用于视频游戏等全屏应用程序或全屏运行 iTunes 视频。他的代码和我的代码之间的唯一区别是他使用的是 Processing 而不是 Eclipse。我将尝试在处理中使用机器人类,看看是否能解决我的问题。 您可能还想尝试下载 VLC,深入了解高级选项,看看它何时/无法捕获像素颜色。我不一定期望它能够更好地工作或成为观看电影的首选程序,但通过检查许多不同的输出方法中的每一种(DirectX 是其中之一),您可能能够收集一些有助于进一步搜索和故障排除。 谢谢。我已经尝试过 VLC,它确实有效。你知道 VLC 使用什么输出方法吗? 工具>首选项>左下角的“全部”单选按钮>向下滚动左侧边栏到“视频”>输出模块。更多的选择和调整比你可以动摇的 LED 棒。

以上是关于Java 屏幕捕获 OpenGL 和 DirectX 全屏应用程序的主要内容,如果未能解决你的问题,请参考以下文章

显卡中如何处理 Direct3D 和 OpenGL 指令?

如何在屏幕抓取中捕获鼠标光标?

图形世界分裂的两派——理清Direct3D和OpenGL的脉络

Mac OS OpenGL 屏幕抓取

SDL/C++ OpenGL 程序,如何阻止 SDL 捕获 SIGINT

Qt5.5下捕获一个带有OpenGL内容的Widget