파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi

import pyautogui as pag import keyboard import time while True: if keyboard.is_pressed("F4"): # F4 누른게 감지되면 t1 = pag.position() # 위치 뽑아서 저장 print(t1) time.sleep(0.5) break while True: if keyboard.is_pressed("F4"): t2 = pag.position() print(t2) time.sleep(0.5) break

이 코드를 실행하면 while문으로 들어가서 대기상태가 됩니다.

이 상태에서 F4를 누르면 마우스 위치 좌표를 t1(타겟 이미지 시작점) 변수에 저장하고 출력까지 해줍니다. 확인이 가능하다는 거죠.

그리고 0.5초 뒤에 다시 대기 상태로 들어갑니다. 그 다음 while문에서 쭉 대기하는 겁니다.

동일한 방법으로 F4를 누르면 t2 변수(타겟 이미지 끝점)에 위치를 저장하고 코드가 종료됩니다.

그냥 pag.position을 이용하는 것보다 이렇게 하면 코드는 좀 길지만 손쉽게 좌표를 저장할 수 있습니다.

저 코드에서 t1 -> f1으로, t2 -> f2로 바꿔서 사용하게 되면 f1, f2도 손쉽게 저장할 수 있습니다.

이 코드를 통해서 우리는 t1, t2, f1, f2 좌표를 미리 확보해야 합니다. 다시 한번 이미지를 잘 보시기 바랍니다. ㅎㅎ

파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi

2. 타겟 이미지 저장

타겟 이미지 저장은 어렵지 않습니다.

파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi

시작점 좌표 x , y 와 저장하려는 이미지의 너비(w), 높이(h)를 region에 기입해주면 됩니다.

region1 = (t1[0], t1[1], t2[0]-t1[0], t2[1]-t1[1]) pag.screenshot("D:/temp/find.png", region = region1)

한번 지정된 주소에 파일이 생겼는지, 그림이 제대로 저장됐는지 확인해 보시길 바랍니다. ㅎㅎ

잘 되었다면 다음 단계로 넘어가면 됩니다.

3. 이미지 서치

이름도 긴 locateAllOnScreen함수는 여러개를 뭉탱이로 결과를 반환하기 때문에 리스트 형태로 바꿔서 확인합니다.

p_list = pag.locateAllOnScreen("D:/temp/find.png", confidence = 0.98) p_list = list(p_list) k = 0 if len(p_list) == 0 : # 전체 화면상에서 찾는 이미지가 없는 경우 print("이미지 없음") else : # 전체 화면 상에서 찾는 이미지가 있는 경우 for p in p_list: ctr = pag.center(p) if ctr[0] >= f1[0] and ctr[0] <= f2[0] and ctr[1] >= f1[1] and ctr[1] <= f2[1]: # 특정 영역에 이미지 있는 경우 print(pag.center(p)) k = 1 if k == 0: # 전체 화면 상에는 이미지가 있지만 특정 영역에는 없는 경우 print("전체에는 있으나 서치 영역에는 이미지 없음")

다들 많이들 쓰는 nox...

회사에서 오토로 돌려놓으려니 오토 마우스는 해당 윈도우가 활성화 되어 있어야 하고

최소화는 아니더라도 비활성화 되어 있는건 이미지  캡쳐해서 클릭하고 싶은데

 

이미지 캡쳐가 안된다

 

그럼 뭐? 구글링 해서 만들어야지 뭐

 

일단 현재 캡쳐하려는 녹스윈도우의 핸들이름을 알아야 하니

spy .zip

3.43MB

spy++ 를 사용해서 이름을 찾자(나중에 UI 로 만들어서 선택하도록 해야지..)

압축을 해제한후 spyxx.exe 를 실행

파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi

윈도우 서치 버튼을 눌러 나오는 팝업에서 조준선을 드래그하여 확인하려는 윈도우 에 드랍합니다.

파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi
파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi

가장 최상단의 윈도우 핸들이 필요합니다.

파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi

최상단의 윈도우를 우클릭후 'Properties...' 를 클릭하면 상세 정보 화면이 표시 됩니다.

윈도우 캡션의 데이터(3)를 메모해 두고 파이선 작업을 시작합니다.

#-*-coding:utf-8  
#한글 입력을 위한 정의

import win32gui 
import win32ui
#윈도우 핸들을 찾기 위한 라이브러리
#pip install pypiwin32
#anconda환경이라면 conda install -c anaconda pywin32
from PIL import Image
#이미지저장을 위한 라이브러리
#pip install pillow

from ctypes import windll
#윈도우 dll사용을 위한 라이브러리

hwndname ='NoxPlayer3'
hwnd = win32gui.FindWindow(None, hwndname)
if hwnd >=1:
    left, top, right, bot = win32gui.GetWindowRect(hwnd)
    w = right - left
    h = bot - top
    hwndDC = win32gui.GetWindowDC(hwnd)
    mfcDC  = win32ui.CreateDCFromHandle(hwndDC)
    saveDC = mfcDC.CreateCompatibleDC()

    saveBitMap = win32ui.CreateBitmap()
    saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)

    saveDC.SelectObject(saveBitMap)

    result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 0)

    bmpinfo = saveBitMap.GetInfo()
    bmpstr = saveBitMap.GetBitmapBits(True)
    im = Image.frombuffer('RGB',(bmpinfo['bmWidth'], bmpinfo['bmHeight']), bmpstr, 'raw', 'BGRX', 0, 1)
    win32gui.DeleteObject(saveBitMap.GetHandle())
    saveDC.DeleteDC()
    mfcDC.DeleteDC()
    win32gui.ReleaseDC(hwnd, hwndDC)
    
if result ==1: 
    #성공적으로 윈도우 값을 가져왔다면
    im.save("test.png")
    #이미지저장

가려져 있어도 정상적으로 해당 윈도우의 이미지를 가져온다.

최소화 되어 있었다면 아래와 같이 타이틀 바만 저장된다.

파이썬 비활성 이미지 서치 - paisseon bihwalseong imiji seochi

성공적으로 test.png로 저장된다.

이제 이미지 서치와 서치한 좌표를 클릭(비활성 클릭)하도록 만들기만 하면된다.

 

나중에 업무 자동화 같은데 사용할수 있겠지?;;; 아마도???

 

공유하기

게시글 관리

구독하기살아가는 이야기

저작자표시 비영리