我想在无头服务器中从 java 获取很多屏幕截图。为此,我的计划如下。
- 将 Xvfb 用于虚拟屏幕。
- 要快速减少队列中的任务,请打开多个 xvfb。
- 要从 java 获取屏幕截图,请使用 java.awt.Robot#createScreenCapture。(java.awt.Robot 的构造函数需要目标 java.awt.GraphicsDevice)
一个问题是 java.awt.GraphicsEnvironment#getScreenDevices() 没有列出 xvfb 屏幕设备。
代码是这样的。 http://www.java2s.com/Code/JavaAPI/java.awt/GraphicsEnvironmentgetScreenDevices.htm
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
public class MainClass {
public static void main(String[] a) throws Exception {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screenDevices = ge.getScreenDevices();
for (int i = 0; i < screenDevices.length; i++)
System.out.println(screenDevices[i].getIDstring());
}
}
终端:
% Xvfb :1 -screen 0 1024x768x24 &
% Xvfb :2 -screen 0 1024x768x24 &
实际上,我在 MBA(Mac OSX 10.6.8)和 HP2140(Ubuntu 10.04)上测试了 Clojure 的 repl 中的等效代码。
(seq (.getScreenDevices (java.awt.GraphicsEnvironment/getLocalGraphicsEnvironment))
;=> (#<CGraphicsDevice CGraphicsDevice[screen=0]>)
我认为应该列出两个 xvfb 设备。有没有办法获得 xvfb GraphicsDevice?
谢谢。