간단한 매크로 프로그램을 만드는 중,
바탕화면을 캡처해서 처리해야 하는 일이 필요했다.
맨 처음에는 pillow 라이브러리에 있는 ImageGrab이나 pyscreenshot을 사용했다.
하지만, 내가 하고 싶은 일을 처리하는 시간보다, 바탕화면을 가져오는 데
더 많은 시간이 들어서 프로그램이 비효율적이였다.
더 좋은 방법이 없나 찾아 보다가, wx를 알게 되었다.
원래 wx는 C++에서 시작된 GUI 프로그램 개발 라이브러리이다.
기능중에 바탕화면 정보를 가져오는 함수가 있어서 써 보니,
월등히 빠른 속도로 캡처를 해서 프로그램이 훨씬 빨라졌다.
단, pillow 함수를 이용해서 wx가 캡처한 이미지를 픽셀 단위로 처리하려 할 때,
이미지 확장자명이 png면 오류가 발생했다. 이 문제의 원인은 잘 모르겠지만,
wx에서 이미지를 저장할 때 bmp으로 저장하면 에러가 발생하지 않는다.
아래는 참고 코드이다.
import time
import pyscreenshot as ImageGrab
import wx
from PIL import Image
def main():
count = 10
start = time.time()
for i in xrange(count):
im = ImageGrab.grab(bbox=(0, 0, 100, 100))
im.save('ImageGrab.png')
print time.time() - start
start = time.time()
app = wx.App()
screen = wx.ScreenDC()
for i in xrange(count):
bmp = wx.EmptyBitmap(100, 100)
mem = wx.MemoryDC(bmp)
mem.Blit(0, 0, 100, 100, screen, 0, 0)
del mem
bmp.SaveFile('wx.bmp', wx.BITMAP_TYPE_BMP)
print time.time() - start
if __name__ == '__main__':
main()
각각 모니터에서 0, 0에서 100, 100 부분을 캡처한 뒤 파일로 저장하는 과정을
10번 반복한다.
아래는 실행 결과이다.
17.631000042
0.203000068665
내 컴퓨터 환경에서 wx 는 pyscreenshot 보다 대략 80배 정도 빠르다.
빠른 캡처가 필요하다면, wx를 사용하는게 좋을 것이다.
wx 설지 url:
https://wxpython.org/download.php
wxpython이란걸 처음 알았네요. 좋은 글 감사합니다~
답글삭제