Javaを使用してスクリーンショットを撮る
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でから入手できます。