[JAVA] 멀티 스크린(다중 디스플레이)을 고려한 스크린샷 찍기

[JAVA] 멀티 스크린(다중 디스플레이)을 고려한 스크린샷 찍기

자바에서 현재 화면(스크린샷)을 BufferedImage 객체로 만드는 코드는 다음과 같다.

    private static BufferedImage getScreenShotImage() {
        BufferedImage screenImgObj = null;
        
        try {

            // 해상도 구하기
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

            // 스크린샷 찍기
            Robot robot = new Robot();
            screenImgObj = robot.createScreenCapture(new Rectangle(0, 0, (int) screenSize.getWidth(), (int) screenSize.getHeight()));

            // 스크린샷 파일화
            // ImageIO.write(screenImgObj, “bmp”, new File(“c:/test/screenshot.bmp”));

        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return screenImgObj;
    }

하지만 위 코드는 모니터가 1개일 때만 잘 작동한다.

모니터가 2개 이상(멀티 스크린, 다중 디스플레이)일 경우 스크린샷을 찍는 코드는 다음과 같다.

화면 하나는 BufferedImage 1개가 되므로 n개의 BufferedImage 가 나온다.

    private static ArrayList<BufferedImage> getScreenShotImageForMultiScreen() {

        ArrayList<BufferedImage> screenImgObjList = new ArrayList<BufferedImage>();
        BufferedImage screenImgObj = null;
        
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        for (GraphicsDevice curGs : gs) {
            GraphicsConfiguration[] gc = curGs.getConfigurations();
            for (GraphicsConfiguration curGc : gc) {

                // 해상도 구하기
                Rectangle bounds = curGc.getBounds();

                try {
                    // 스크린샷 찍기
                    Robot robot = new Robot();
                    screenImgObj = robot.createScreenCapture(new Rectangle((int) bounds.getX(), (int) bounds.getY(), (int) bounds.getWidth(), (int) bounds.getHeight()));

                    if (screenImgObj != null) {
                        screenImgObjList.add(screenImgObj);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        return screenImgObjList;
    }