Acquisizione di schermate utilizzando Java

1. Introduzione

In questo tutorial, daremo uno sguardo ad alcuni modi diversi per acquisire uno screenshot in Java.

2. Acquisizione di una schermata utilizzando il robot

Nel nostro primo esempio, faremo uno screenshot della schermata principale.

Per questo, useremo il metodo createScreenCapture () dalla classe Robot . Accetta un Rectangle come parametro che imposta i limiti per lo screenshot e restituisce un oggetto BufferedImage . Il BufferedImage può essere ulteriormente utilizzato per creare un file di immagine:

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

Le dimensioni dello schermo sono accessibili tramite la classe Toolkit utilizzando il suo metodo getScreenSize () . Sui sistemi con più schermi, il display principale viene utilizzato per impostazione predefinita.

Dopo aver catturato lo schermo in BufferedImage, possiamo scriverlo nel file con ImageIO.write () . Per fare ciò, avremo bisogno di due parametri aggiuntivi. Il formato dell'immagine e il file dell'immagine stesso. Nel nostro esempio, stiamo usando il. bmp , ma ad altri piace. Sono disponibili anche png, .jpg o .gif .

3. Acquisizione di una schermata di più schermate

È anche possibile acquisire uno screenshot di più schermi contemporaneamente . Proprio come nell'esempio precedente, possiamo utilizzare il metodo createScreenCapture () dalla classe Robot . Ma questa volta i limiti dello screenshot devono coprire tutte le schermate richieste.

Per ottenere tutti i display, useremo la classe GraphicsEnvironment e il suo metodo getScreenDevices () .

Successivamente, recupereremo il limite di ogni singolo schermo e creeremo un rettangolo che si adatterà a tutti loro:

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

Durante l'iterazione sui display, sommiamo sempre le larghezze e scegliamo solo un'altezza massima poiché gli schermi saranno concatenati orizzontalmente.

Andando oltre dobbiamo salvare l'immagine dello screenshot. Come nell'esempio precedente, possiamo utilizzare il metodo ImageIO.write () .

4. Acquisizione di uno screenshot di un determinato componente della GUI

Possiamo anche fare uno screenshot di un dato componente dell'interfaccia utente.

È possibile accedere facilmente alle dimensioni tramite il metodo getBounds () poiché ogni componente è consapevole delle sue dimensioni e della sua posizione.

In questo caso, non useremo l' API Robot . Invece, useremo il metodo paint () dalla classe Component che disegnerà il contenuto direttamente in 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()); }

Dopo aver ottenuto il limite del componente, dobbiamo creare BufferedImage. Per questo, abbiamo bisogno della larghezza, dell'altezza e del tipo di immagine. In questo caso, stiamo usando BufferedImage.TYPE_INT_ARGB che si riferisce a un'immagine a colori a 8 bit.

Quindi andiamo avanti per invocare il metodo paint () per riempire BufferedImage e come negli esempi precedenti lo salviamo in un file con il metodo ImageIO.write () .

5. conclusione

In questo tutorial, abbiamo imparato diversi modi su come acquisire schermate utilizzando Java.

Come sempre il codice sorgente con tutti gli esempi in questo tutorial è disponibile su GitHub.