Screenshots mit Java machen

1. Einleitung

In diesem Tutorial werden einige verschiedene Möglichkeiten zum Erstellen eines Screenshots in Java vorgestellt.

2. Einen Screenshot mit dem Roboter machen

In unserem ersten Beispiel machen wir einen Screenshot des Hauptbildschirms.

Dazu verwenden wir die Methode createScreenCapture () aus der Robot- Klasse. Es wird ein Rechteck als Parameter verwendet, der die Grenzen für den Screenshot festlegt und ein BufferedImage- Objekt zurückgibt . Das BufferedImage kann weiter verwendet werden, um eine Bilddatei zu erstellen:

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

Auf die Abmessungen des Bildschirms kann über die Toolkit- Klasse mit der Methode getScreenSize () zugegriffen werden. Auf Systemen mit mehreren Bildschirmen wird standardmäßig die primäre Anzeige verwendet.

Nachdem wir den Bildschirm in BufferedImage aufgenommen haben, können wir ihn mit ImageIO.write () in die Datei schreiben . Dazu benötigen wir zwei zusätzliche Parameter. Das Bildformat und die Bilddatei selbst. In unserem Beispiel verwenden wir die. BMP- Format, aber andere mögen. png, .jpg oder .gif sind ebenfalls verfügbar.

3. Machen Sie einen Screenshot von mehreren Bildschirmen

Es ist auch möglich, einen Screenshot von mehreren Anzeigen gleichzeitig zu machen . Genau wie im vorherigen Beispiel können wir die Methode createScreenCapture () aus der Robot- Klasse verwenden. Diesmal müssen die Grenzen des Screenshots jedoch alle erforderlichen Bildschirme abdecken.

Um alle Anzeigen zu erhalten, verwenden wir die GraphicsEnvironment- Klasse und ihre getScreenDevices () -Methode.

Als nächstes werden wir die Begrenzung jedes einzelnen Bildschirms abrufen und ein Rechteck erstellen , das zu allen passt:

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

Während wir über die Anzeigen iterieren, addieren wir immer die Breiten und wählen nur eine maximale Höhe, da die Bildschirme horizontal verkettet werden.

Wenn wir weiter gehen, müssen wir das Screenshot-Bild speichern. Wie im vorherigen Beispiel können wir die ImageIO.write () -Methode verwenden.

4. Erstellen eines Screenshots einer bestimmten GUI-Komponente

Wir können auch einen Screenshot einer bestimmten UI-Komponente machen.

Auf die Dimensionen kann einfach über die Methode getBounds () zugegriffen werden , da jede Komponente ihre Größe und Position kennt.

In diesem Fall verwenden wir die Roboter- API nicht. Stattdessen verwenden wir die paint () -Methode aus der Component- Klasse, die den Inhalt direkt in das BufferedImage zeichnet :

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

Nachdem wir die Bindung der Komponente erhalten haben, müssen wir das BufferedImage erstellen . Dazu benötigen wir die Breite, Höhe und den Bildtyp. In diesem Fall verwenden wir BufferedImage.TYPE_INT_ARGB, das sich auf ein 8-Bit-Farbbild bezieht.

Anschließend rufen wir die paint () -Methode auf, um das BufferedImage zu füllen. Wie in den vorherigen Beispielen speichern wir es in einer Datei mit der ImageIO.write () -Methode.

5. Schlussfolgerung

In diesem Tutorial haben wir verschiedene Möglichkeiten zum Erstellen von Screenshots mit Java kennengelernt.

Wie immer ist der Quellcode mit allen Beispielen in diesem Tutorial auf GitHub verfügbar.