파이썬으로 바탕화면 빠르게 캡처 하기. 2016년 10월 5일 수요일

프로그래밍/한글 2016. 12. 3. 23:45

간단한 매크로 프로그램을 만드는 중,
바탕화면을 캡처해서 처리해야 하는 일이 필요했다.

 맨 처음에는 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

설정

트랙백

댓글

라즈베리 파이 GPIO 사용하기 2016년 9월 21일 수요일

프로그래밍/한글 2016. 12. 3. 23:42

GPIO(General Purpose Input Output - 범용입출력)



센서에 따라서 브레드 보드(일명 빵판)이 필요할 수도 있다.




가장 기본적인 센서 사용법은 센서에 5V 전압과 GND를 연결한 뒤,
데이터를 전송하기 위해 적당한 번호에 선을 연결하면 된다.
(위에서는 #4, #17, #18... 등)

라즈베리파이에서 python의 RPi.GPIO 모듈을 이용하여 GPIO를 사용할 수 있다.

python 코드


# -*- coding: utf8 -*-

from RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUB_UP)

print GPIO.input(4)


위의 예제는 #4로 부터 정보를 읽어들여서 출력하는 예제이다.
어떤 센서를 연결했느냐에 따라 온도 값이나 화재 상황등
다양한 정보를 입력 받아서 처리할 수 있다.


설정

트랙백

댓글