Рубрики
Без рубрики

Создание Скриншотов С Помощью Java

Узнайте, как делать скриншоты с помощью Java.

Автор оригинала: baeldung.

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 .