3

我想在无头服务器中从 java 获取很多屏幕截图。为此,我的计划如下。

  1. 将 Xvfb 用于虚拟屏幕。
  2. 要快速减少队列中的任务,请打开多个 xvfb。
  3. 要从 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?

谢谢。

4

0 回答 0