Prendre des captures d'écran avec Java

1. Introduction

Dans ce didacticiel, nous examinerons différentes façons de prendre une capture d'écran en Java.

2. Prendre une capture d'écran avec Robot

Dans notre premier exemple, nous allons faire une capture d'écran de l'écran principal.

Pour cela, nous utiliserons la méthode createScreenCapture () de la classe Robot . Il prend un Rectangle comme paramètre qui définit les limites de la capture d'écran et renvoie un objet BufferedImage . Le BufferedImage peut encore être utilisé pour créer un fichier image:

@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()); }

Les dimensions de l'écran sont accessibles via la classe Toolkit en utilisant sa méthode getScreenSize () . Sur les systèmes avec plusieurs écrans, l'affichage principal est utilisé par défaut.

Après avoir capturé l'écran dans BufferedImage, nous pouvons l'écrire dans le fichier avec ImageIO.write () . Pour ce faire, nous aurons besoin de deux paramètres supplémentaires. Le format d'image et le fichier image lui-même. Dans notre exemple, nous utilisons le. format bmp , mais d'autres aiment. png, .jpg ou .gif sont également disponibles.

3. Prendre une capture d'écran de plusieurs écrans

Il est également possible de prendre une capture d'écran de plusieurs écrans à la fois . Tout comme avec l'exemple précédent, nous pouvons utiliser la méthode createScreenCapture () de la classe Robot . Mais cette fois, les limites de la capture d'écran doivent couvrir tous les écrans requis.

Afin d'obtenir tous les affichages, nous utiliserons la classe GraphicsEnvironment et sa méthode getScreenDevices () .

Ensuite, nous allons récupérer la limite de chaque écran individuel et créer un rectangle qui s'adaptera à tous:

@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()); }

Lors de l'itération sur les écrans, nous additionnons toujours les largeurs et choisissons une seule hauteur maximale car les écrans seront concaténés horizontalement.

Pour aller plus loin, nous devons enregistrer l'image de la capture d'écran. Comme dans l'exemple précédent, nous pouvons utiliser la méthode ImageIO.write () .

4. Prendre une capture d'écran d'un composant GUI donné

Nous pouvons également prendre une capture d'écran d'un composant d'interface utilisateur donné.

Les dimensions sont facilement accessibles via la méthode getBounds () car chaque composant est conscient de sa taille et de son emplacement.

Dans ce cas, nous n'allons pas utiliser l' API Robot . Au lieu de cela, nous allons utiliser la méthode paint () de la classe Component qui dessinera le contenu directement dans 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()); }

Après avoir obtenu la liaison du composant, nous devons créer BufferedImage. Pour cela, nous avons besoin de la largeur, de la hauteur et du type d'image. Dans ce cas, nous utilisons BufferedImage.TYPE_INT_ARGB qui fait référence à une image couleur 8 bits.

Nous avançons ensuite pour appeler la méthode paint () pour remplir BufferedImage et comme dans les exemples précédents, nous l'enregistrons dans un fichier avec la méthode ImageIO.write () .

5. Conclusion

Dans ce didacticiel, nous avons appris plusieurs façons de prendre des captures d'écran à l'aide de Java.

Comme toujours, le code source avec tous les exemples de ce didacticiel est disponible à l'adresse over sur GitHub.