본문 바로가기
공부/python

[Pytesseract를 사용한 메이플스토리 길드 스코어 분석] 전체화면 스크린샷 찍고 스크린샷 일부분만 저장하기

by 고기 2022. 3. 29.

이전 글에서 프로그램 UI 및 함수 원형을 작성했었다. 이번 글에서는 스크린샷 찍는 함수에 대해 알아본다.

 

작성했던 코드 중 스크린샷에 대한 코드를 가져왔다. pyautogui 라이브러리를 사용하면 파이썬에서 스크린샷을 찍을 수 있다. 라이브러리를 선언하고 클릭할 때마다 스크린샷을 찍기 위한 버튼과 함수를 작성한다. 12라인에서 Button에 대한 제목과 폰트, 배경, 클릭했을 때 딜레이 등을 설정하고, command 함수를 call_Screenshot() 함수로 지정했다.

library list
import pyautogui as pg

class UI:
    def __init__(self):   
        variable & window & button setting
        
        '''
        스크린샷 버튼
        '''
        self.label_stat = tk.Label(self.main_window, text = "[1] 스크린샷 저장", font=font, bg="pink")
        self.label_stat.place(x=250, y=50)        
        btn_stat = tk.Button(self.main_window, text="Screenshot", font=font, bg="pink", overrelief="solid", command=self.call_Screenshot, repeatdelay=1000)
        btn_stat.place(x=250, y=90)        
                
        self.main_window.mainloop()
       
    '''
    버튼 누르면 스크린샷 찍음
    '''
    def call_Screenshot(self):        
        self.main_window.destroy()
        
    def function list

 

Button을 클릭할 때마다 call_Screenshot() 함수가 호출되어 화면이 캡쳐되는데, 우선 21~28라인에 대한 설명을 하기 전에 먼저 전체 화면에서 원하는 위치의 부분만 잘라서 저장하는 방법을 설명한다.

library list
import pyautogui as pg

class UI:
    def __init__(self):   
        variable & window & button setting
        
        '''
        스크린샷 버튼
        '''
        self.label_stat = tk.Label(self.main_window, text = "[1] 스크린샷 저장", font=font, bg="pink")
        self.label_stat.place(x=250, y=50)        
        btn_stat = tk.Button(self.main_window, text="Screenshot", font=font, bg="pink", overrelief="solid", command=self.call_Screenshot, repeatdelay=1000)
        btn_stat.place(x=250, y=90)        
                
        self.main_window.mainloop()
       
    '''
    버튼 누르면 스크린샷 찍음
    '''
    def call_Screenshot(self):        
        mission = pg.locateOnScreen('./file/g_mission.png')
        mission = pg.screenshot('./'+self.date+'/save/mission_im'+str(self.s_count)+'.png', region=(mission.left, mission.top+30, mission.width, mission.height+395))
        
        under = pg.locateOnScreen('./file/g_under.png') 
        under = pg.screenshot('./'+self.date+'/save/under_im'+str(self.s_count)+'.png', region=(under.left, under.top+30, under.width, under.height+395))
        
        flag  = pg.locateOnScreen('./file/g_flag.png')                        
        flag  = pg.screenshot('./'+self.date+'/save/flag_im'+str(self.s_count)+'.png', region=(flag.left, flag.top+30, flag.width, flag.height+395))
        
    def function list

 

기본적으로 스크린샷을 찍는 방법은 굉장히 간단한데, pyautogui 라이브러리의 screenshot 메소드를 사용하면 다음과 같이 전체 화면이 캡쳐된다. screenshot 메소드에 region옵션을 줘서 사진의 일부 영역만 저장할수도 있다.  

사진1

 

우선 사진에서 찾고 싶은 부분을 다음과 같이 파일로 저장한다. 

사진2

 

다시 코드로 돌아와서 screenshot() 메소드를 보자. screenshot()의 첫 번째 인자로는 파일이 저장될 경로와 이름을 설정한다. 두 번째 인자인 region은 전체 화면이 캡쳐된 상태에서 지정해준 영역만 저장하겠다는 말이다. 

    '''
    버튼 누르면 스크린샷 찍음
    '''
    def call_Screenshot(self):        
        mission = pg.locateOnScreen('./file/g_mission.png')
        mission = pg.screenshot('./'+self.date+'/save/mission_im'+str(self.s_count)+'.png', region=(mission.left, mission.top+30, mission.width, mission.height+395))
        
        ...

 

예를들어 설명하자면, 아래 사진에서 사진2의 g_mission.png의 위치를 특정할 수 있다. g_mission.png이 빨간 네모친 부분만큼이라고 했을 때, 빨간네모의 왼쪽 상단을 (0, 0)이라고 가정해보자. 현재 나에게 필요한 영역은 파란네모 영역이기 때문에, (0, 0)에서 해당 영역만큼 region을 지정해 준 것이다.

사진3

 

코드를 실행시켜서 사진을 찍으면 다음과 같이 사진이 저장된다.

사진4

 

마지막으로, 스크린샷 버튼을 클릭하면 작업이 끝났음을 알 수 있도록 코드를 추가한다.

    '''
    버튼 누르면 스크린샷 찍음
    '''
    def call_Screenshot(self):        
        mission = pg.locateOnScreen('./file/g_mission.png')
        mission = pg.screenshot('./'+self.date+'/save/mission_im'+str(self.s_count)+'.png', region=(mission.left, mission.top+30, mission.width, mission.height+395))
        
        under = pg.locateOnScreen('./file/g_under.png') 
        under = pg.screenshot('./'+self.date+'/save/under_im'+str(self.s_count)+'.png', region=(under.left, under.top+30, under.width, under.height+395))
        
        flag  = pg.locateOnScreen('./file/g_flag.png')                        
        flag  = pg.screenshot('./'+self.date+'/save/flag_im'+str(self.s_count)+'.png', region=(flag.left, flag.top+30, flag.width, flag.height+395))
        
        self.progress.insert(self.text_index, 'save my_screesnshot'+str(self.s_count)+'.png\n')
        self.text_index = self.text_index + 1.0    
        self.s_count+=1

 

여기까지 스크린샷 함수 작동에 대해 알아보았다. 다음 글에서 이렇게 저장된 이미지에서 tesseract를 사용한 문자를 인식시키는 방법에 대해 알아본다.

댓글