Toma de capturas de pantalla con Java

1. Introducción

En este tutorial, veremos algunas formas diferentes de tomar una captura de pantalla en Java.

2. Tomar una captura de pantalla con un robot

En nuestro primer ejemplo, vamos a tomar una captura de pantalla de la pantalla principal.

Para eso, usaremos el método createScreenCapture () de la clase Robot . Toma un Rectangle como parámetro que establece los límites para la captura de pantalla y devuelve un objeto BufferedImage . El BufferedImage se puede utilizar más para crear un archivo de imagen:

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

Se puede acceder a las dimensiones de la pantalla a través de la clase Toolkit mediante su método getScreenSize () . En sistemas con varias pantallas, la pantalla principal se utiliza de forma predeterminada.

Después de capturar la pantalla en BufferedImage, podemos escribirla en el archivo con ImageIO.write () . Para hacerlo, necesitaremos dos parámetros adicionales. El formato de imagen y el archivo de imagen en sí. En nuestro ejemplo, estamos usando. bmp , pero a otros les gusta. png, .jpg o .gif también están disponibles.

3. Tomar una captura de pantalla de varias pantallas

También es posible tomar una captura de pantalla de varias pantallas a la vez . Al igual que en el ejemplo anterior, podemos usar el método createScreenCapture () de la clase Robot . Pero esta vez los límites de la captura de pantalla deben cubrir todas las pantallas requeridas.

Para obtener todas las pantallas, usaremos la clase GraphicsEnvironment y su método getScreenDevices () .

A continuación, buscaremos el límite de cada pantalla individual y crearemos un Rectángulo que se ajustará a todas:

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

Mientras iteramos sobre las pantallas, siempre sumamos los anchos y elegimos solo una altura máxima ya que las pantallas se concatenarán horizontalmente.

Yendo más allá, necesitamos guardar la imagen de captura de pantalla. Como en el ejemplo anterior, podemos usar el método ImageIO.write () .

4. Tomar una captura de pantalla de un componente de GUI dado

También podemos tomar una captura de pantalla de un componente de la interfaz de usuario determinado.

Se puede acceder fácilmente a las dimensiones a través del método getBounds () ya que cada componente es consciente de su tamaño y ubicación.

En este caso, no vamos a utilizar la API de robot . En su lugar, usaremos el método paint () de la clase Component que dibujará el contenido directamente en 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()); }

Después de obtener el enlace del componente, necesitamos crear la imagen Buffered. Para esto, necesitamos el ancho, alto y tipo de imagen. En este caso, estamos usando BufferedImage.TYPE_INT_ARGB que se refiere a una imagen en color de 8 bits.

Luego avanzamos para invocar el método paint () para completar la Imagen Buffered y, al igual que en los ejemplos anteriores, la guardamos en un archivo con el método ImageIO.write () .

5. Conclusión

En este tutorial, hemos aprendido varias formas de realizar capturas de pantalla con Java.

Como siempre, el código fuente con todos los ejemplos de este tutorial está disponible en GitHub.