Mengambil Screenshot Menggunakan Java

1. Perkenalan

Dalam tutorial ini, kita akan melihat beberapa cara berbeda untuk mengambil screenshot di Java.

2. Mengambil Screenshot Menggunakan Robot

Dalam contoh pertama kami, kami akan mengambil tangkapan layar dari layar utama.

Untuk itu, kita akan menggunakan metode createScreenCapture () dari kelas Robot . Dibutuhkan Rectangle sebagai parameter yang menetapkan batas untuk tangkapan layar dan mengembalikan objek BufferedImage . The BufferedImage dapat lebih digunakan untuk membuat file gambar:

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

Dimensi layar dapat diakses melalui kelas Toolkit dengan menggunakan metode getScreenSize () . Pada sistem dengan banyak layar, tampilan utama digunakan secara default.

Setelah menangkap layar menjadi BufferedImage, kita bisa menulisnya ke file dengan ImageIO.write () . Untuk melakukannya, kita membutuhkan dua parameter tambahan. Format gambar dan file gambar itu sendiri. Dalam contoh kami, kami menggunakan. bmp , tetapi yang lain suka. png, .jpg atau .gif juga tersedia.

3. Mengambil Screenshot dari Beberapa Layar

Anda juga dapat mengambil tangkapan layar dari beberapa tampilan sekaligus . Sama seperti contoh sebelumnya, kita bisa menggunakan metode createScreenCapture () dari kelas Robot . Tapi kali ini batasan screenshot harus mencakup semua layar yang diperlukan.

Untuk mendapatkan semua tampilan, kita akan menggunakan kelas GraphicsEnvironment dan metode getScreenDevices () .

Selanjutnya, kita akan mengambil batas masing-masing layar dan membuat Persegi Panjang yang akan cocok dengan semuanya:

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

Saat melakukan iterasi pada tampilan, kami selalu menjumlahkan lebar dan memilih hanya satu tinggi maksimum karena layar akan digabungkan secara horizontal.

Lebih jauh kita perlu menyimpan gambar tangkapan layar. Seperti pada contoh sebelumnya, kita dapat menggunakan metode ImageIO.write () .

4. Mengambil Screenshot dari Komponen GUI yang Diberikan

Kami juga dapat mengambil tangkapan layar dari komponen UI tertentu.

Dimensi dapat dengan mudah diakses melalui metode getBounds () karena setiap komponen mengetahui ukuran dan lokasinya.

Dalam hal ini, kami tidak akan menggunakan Robot API. Sebagai gantinya, kita akan menggunakan metode paint () dari kelas Komponen yang akan menarik konten langsung ke 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()); }

Setelah mendapatkan komponen terikat kita perlu membuat BufferedImage. Untuk ini, kita membutuhkan lebar, tinggi, dan jenis gambar. Dalam kasus ini, kami menggunakan BufferedImage.TYPE_INT_ARGB yang mengacu pada gambar berwarna 8-bit.

Kami kemudian melanjutkan untuk memanggil metode paint () untuk mengisi BufferedImage dan sama seperti pada contoh sebelumnya kami menyimpannya ke file dengan metode ImageIO.write () .

5. Kesimpulan

Dalam tutorial ini, kami telah mempelajari beberapa cara mengambil tangkapan layar menggunakan Java.

Seperti biasa, kode sumber dengan semua contoh dalam tutorial ini tersedia di GitHub.