1. введение
В этом уроке мы рассмотрим несколько различных способов создания скриншота на Java.
2. Создание скриншота с помощью Робота
В нашем первом примере мы сделаем скриншот главного экрана.
Для этого мы будем использовать метод createScreenCapture() из класса Robot . Он принимает Rectangle в качестве параметра, который задает границы снимка экрана и возвращает BufferedImage объект. BufferedImage может быть дополнительно использован для создания файла изображения:
@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()); }
Размеры экрана доступны через класс Toolkit с помощью метода getScreenSize () . В системах с несколькими экранами по умолчанию используется основной дисплей.
После захвата экрана в BufferedImage, мы можем записать его в файл с помощью ImageIO.write() . Для этого нам понадобятся два дополнительных параметра. Формат изображения и сам файл изображения. В нашем примере мы используем . bmp формат, но и другие подобные . также доступны png, .jpg или .gif .
3. Создание скриншота нескольких экранов
Также можно сделать скриншот нескольких дисплеев одновременно . Как и в предыдущем примере, мы можем использовать метод createScreenCapture() из класса Robot . Но на этот раз границы скриншота должны охватывать все необходимые экраны.
Чтобы получить все дисплеи, мы будем использовать класс Graphics Environment и его метод getScreenDevices () .
Затем мы выберем границы каждого отдельного экрана и создадим Прямоугольник , который будет соответствовать всем из них:
@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()); }
При повторном просмотре дисплеев мы всегда суммируем ширину и выбираем только одну максимальную высоту, так как экраны будут объединены горизонтально.
Идя дальше, нам нужно сохранить изображение скриншота. Как и в предыдущем примере, мы можем использовать метод ImageIO.write () .
4. Создание скриншота данного компонента графического интерфейса
Мы также можем сделать снимок экрана данного компонента пользовательского интерфейса.
Размеры могут быть легко доступны через getBounds() метод, поскольку каждый компонент знает о своем размере и местоположении.
В этом случае мы не будем использовать API Robot . Вместо этого мы собираемся использовать метод paint() из класса Component , который будет рисовать содержимое непосредственно в 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()); }
После получения привязки компонента нам нужно создать BufferedImage. Для этого нам нужны ширина, высота и тип изображения. В этом случае мы используем BufferedImage.TYPE_INT_ARGB , который относится к 8-битному цветному изображению.
Затем мы переходим к вызову метода paint() для заполнения BufferedImage и, как и в предыдущих примерах, сохраняем его в файл с помощью метода ImageIO.write () .
5. Заключение
В этом уроке мы узнали несколько способов, как делать скриншоты с помощью Java.
Как всегда, исходный код со всеми примерами в этом учебнике доступен на GitHub .