1. 序章

このチュートリアルでは、Javaでスクリーンショットを撮るいくつかの異なる方法を見ていきます。

2. ロボットを使用してスクリーンショットを撮る

最初の例では、メイン画面のスクリーンショットを撮ります。

そのために、 RobotクラスのcreateScreenCapture()メソッドを使用します。 スクリーンショットの境界を設定し、 BufferedImage オブジェクトを返すパラメーターとして、Rectangleを取ります。 BufferedImage をさらに使用して、イメージファイルを作成できます。

@Test
public void givenMainScreen_whenTakeScreenshot_thenSaveToFile() throws Exception {
    Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    BufferedImage capture = new Robot().createScreenCapture(screenRect);

    File imageFile = new File("single-screen.bmp");
    ImageIO.write(capture, "bmp", imageFile );
    assertTrue(imageFile .exists());
}

画面のサイズには、 Toolkit クラスから、 getScreenSize()メソッドを使用してアクセスできます。 複数の画面があるシステムでは、デフォルトでプライマリディスプレイが使用されます。

画面をBufferedImage、にキャプチャした後、 ImageIO.write()を使用してファイルに書き込むことができます。 そのためには、2つの追加パラメーターが必要です。 画像形式と画像ファイル自体。 この例では、 .bmp形式を使用していますが、.png、.jpg、.gifなどの他の形式も使用できます。

3. 複数の画面のスクリーンショットを撮る

複数のディスプレイのスクリーンショットを一度に撮ることも可能です。 前の例と同様に、 RobotクラスのcreateScreenCapture()メソッドを使用できます。 ただし、今回はスクリーンショットの境界が必要なすべての画面をカバーする必要があります。

すべての表示を取得するには、 GraphicsEnvironmentクラスとそのgetScreenDevices()メソッドを使用します。

次に、個々の画面の境界を取得し、それらすべてに適合するRectangleを作成します。

@Test
public void givenMultipleScreens_whenTakeScreenshot_thenSaveToFile() throws Exception {
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] screens = ge.getScreenDevices();

    Rectangle allScreenBounds = new Rectangle();
    for (GraphicsDevice screen : screens) {
        Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();
        allScreenBounds.width += screenBounds.width;
        allScreenBounds.height = Math.max(allScreenBounds.height, screenBounds.height);
    }

    BufferedImage capture = new Robot().createScreenCapture(allScreenBounds);
    File imageFile = new File("all-screens.bmp");
    ImageIO.write(capture, "bmp", imageFile);
    assertTrue(imageFile.exists());
}

画面が水平方向に連結されるため、表示を繰り返しながら、常に幅を合計し、最大の高さを1つだけ選択します。

さらに進んで、スクリーンショット画像を保存する必要があります。 前の例と同様に、 ImageIO.write()メソッドを使用できます。

4. 特定のGUIコンポーネントのスクリーンショットを撮る

特定のUIコンポーネントのスクリーンショットを撮ることもできます。

すべてのコンポーネントがそのサイズと場所を認識しているため、 getBounds()メソッドを介してディメンションに簡単にアクセスできます。

この場合、 RobotAPIは使用しません。 代わりに、 Componentクラスのpaint()メソッドを使用して、コンテンツをBufferedImageに直接描画します。

@Test
public void givenComponent_whenTakeScreenshot_thenSaveToFile(Component component) throws Exception {
    Rectangle componentRect = component.getBounds();
    BufferedImage bufferedImage = new BufferedImage(componentRect.width, componentRect.height, BufferedImage.TYPE_INT_ARGB);
    component.paint(bufferedImage.getGraphics());

    File imageFile = new File("component-screenshot.bmp");
    ImageIO.write(bufferedImage, "bmp", imageFile );
    assertTrue(imageFile.exists());
}

コンポーネントの境界を取得したら、 BufferedImageを作成する必要があります。このためには、幅、高さ、および画像タイプが必要です。 この場合、8ビットのカラー画像を参照するBufferedImage.TYPE_INT_ARGBを使用しています。

次に、 paint()メソッドを呼び出して BufferedImage を埋めます。前の例と同じように、 ImageIO.write()を使用してファイルに保存します。 メソッド。

5. 結論

このチュートリアルでは、Javaを使用してスクリーンショットを撮る方法をいくつか学びました。

いつものように、このチュートリアルのすべての例を含むソースコードは、GitHubから入手できます。