Mengambil Tangkapan Skrin Menggunakan Java

1. Pengenalan

Dalam tutorial ini, kita akan melihat beberapa cara mengambil tangkapan skrin di Java.

2. Mengambil Tangkapan Skrin Menggunakan Robot

Dalam contoh pertama kami, kami akan mengambil tangkapan skrin utama.

Untuk itu, kami akan menggunakan kaedah createScreenCapture () dari kelas Robot . Dibutuhkan Rectangle sebagai parameter yang menetapkan batas untuk tangkapan skrin dan mengembalikan objek BufferedImage . The BufferedImage boleh lagi digunakan untuk mencipta fail imej:

@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 skrin dapat diakses melalui kelas Toolkit dengan menggunakan kaedah getScreenSize () . Pada sistem dengan beberapa skrin, paparan utama digunakan secara lalai.

Setelah menangkap skrin ke BufferedImage, kita dapat menulisnya ke fail dengan ImageIO.write () . Untuk melakukannya, kami memerlukan dua parameter tambahan. Format gambar dan fail gambar itu sendiri. Dalam contoh kami, kami menggunakan. format bmp , tetapi yang lain suka. png, .jpg atau .gif juga ada.

3. Mengambil Tangkapan Skrin Pelbagai Skrin

Anda juga boleh mengambil tangkapan skrin pelbagai paparan sekaligus . Sama seperti contoh sebelumnya, kita boleh menggunakan kaedah createScreenCapture () dari kelas Robot . Tetapi kali ini batas tangkapan skrin perlu meliputi semua skrin yang diperlukan.

Untuk mendapatkan semua paparan, kami akan menggunakan kelas GraphicsEnvironment dan kaedah getScreenDevices () .

Seterusnya, kita akan mengambil batas setiap skrin individu dan membuat Rectangle yang akan sesuai dengan mereka semua:

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

Semasa mengulangi paparan, kami selalu menjumlahkan lebar dan memilih hanya satu ketinggian maksimum kerana layar akan digabungkan secara mendatar.

Untuk melangkah lebih jauh, kita perlu menyimpan gambar tangkapan skrin. Seperti contoh sebelumnya, kita boleh menggunakan kaedah ImageIO.write () .

4. Mengambil Tangkapan Skrin Komponen GUI yang Diberikan

Kami juga dapat mengambil tangkapan skrin komponen UI yang diberikan.

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

Dalam kes ini, kami tidak akan menggunakan Robot API. Sebaliknya, kita akan menggunakan kaedah cat () dari kelas Komponen yang akan menarik kandungan terus 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 mendapat ikatan komponen, kita perlu membuat BufferedImage. Untuk ini, kita memerlukan lebar, tinggi, dan jenis gambar. Dalam kes ini, kami menggunakan BufferedImage.TYPE_INT_ARGB yang merujuk kepada gambar warna 8-bit.

Kami kemudian bergerak maju untuk menggunakan kaedah cat () untuk mengisi BufferedImage dan sama seperti dalam contoh sebelumnya kami menyimpannya ke fail dengan kaedah ImageIO.write () .

5. Kesimpulan

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

Seperti biasa kod sumber dengan semua contoh dalam tutorial ini terdapat di GitHub.