본문 바로가기
코딩/오토핫키

오토핫키로 화면내 이미지를 찾는 방법

by DIYver 2020. 10. 20.

이번 포스트에서는 어떻게 보면 오토핫키의 가장 핵심인 화면내 이미지를 검색한는 방법을 다뤄보도록 한다.

 

 

매크로를 부정적으로 바라보는 시선은 많다.

하지만 매크로는 단순히 자동 업무 처리 프로그램이라는 관점에서 보면 매우 중요한 녀석이다.

 

매크로 프로그램이 마우스를 클릭해야하는데, 어디를 클릭해야 할지 모른다면 의미가 없다.

만약 좌표만을 이용해서 마우스 클릭을 했었다면 그 위치가 살짝이라도 바뀔경우 무쓸모가 되어버린다.

 

따라서 멍청하게 좌표만 이용하기보다는 마치 사람처럼 화면을 인식하고 클릭하는 것이 중요하다고 할 수 있겠다.

사람처럼 화면을 인식하게 하는 명령어를 오토핫키에서 지원해주는데,

그게 바로 ImageSearch 라는 명령어이다.

 

 

ImageSearch, OutputVarX, OutputVarY, X1, Y1, X2, Y2, *TransN *N, ImageFile

사용 방법을 이해해보자.

 

 - OutputVarX : 찾은 이미지의 X 좌표값

 - OutputVarY : 찾은 이미지의 Y 좌표값

 - X1 : 찾을 영역의 시작하는 X축 좌표

 - Y1 : 찾을 영역의 시작하는 Y축 좌표

 - X2 : 찾을 영역이 끝나는 X축 좌표

 - Y2 : 찾을 영역이 끝나는 Y축 좌표

 - *TransN *N : *TransN은 이미지에서 제거할 색상, N은 오차범위(0~255)를 뜻함

   오차범위가 작을수록 이미지를 정확하게 찾을 수 있다.

 - ImageFile : 찾을 이미지의 파일 이름

 

뭔가 파라미터들이 많은데, 너무 걱정할 필요가 없다.

사용하다보면 금방 이해하게 된다.

이게 오토핫키의 장점이다.

 

다만 ImageSearch 명령어를 사용할 때에는

CoordMode 를 잘 설정해야 한다.

 

Mouse 입력 셋팅과 Pixel 입력 세팅이 같아야 한다는 것이다.

만약 다르다면 이미지를 찾은 좌표가 

마우스 클릭 좌표와 기준점이 맞지않아 다른 부분을 클릭하게 될 수도 있다.

 

SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

CoordMode,Pixel,Screen
CoordMode,mouse,Screen

;CoordMode, Mouse, Window

F9::
ImageSearch, vx, vy, 0, 0, A_ScreenWidth, A_ScreenHeight, test.png
if ErrorLevel = 0
{
	MsgBox, FIND
	MouseMove, vx+50, vy+50
}
else if ErrorLevel = 1
	MsgBox, can't Find

return

위의 코드를 그대로 오토핫키에 넣고 실행시켜보면 된다.

다만 자신이 찾고자 하는 이미지는 캡처도구를 통해서 오토핫키 파일과 같은 폴더에 저장시켜 놓아야 한다.

 

코드를 위에서부터 살짝 해석을 해보면,

 

SetWorkingDir %A_SciptDir% 

- 기본 폴더를 오토핫키 파일(스크립트)이 있는 폴더로 설정한다.

  이 세팅이 없으면 참조하려는 파일들의 위치를 풀네임으로 써줘야 한다.

 

CoordMode,Pixel,Screen
CoordMode,mouse,Screen

- Pixel 과 mouse 의 좌표계를 일치시키는 작업이다.

  ImageSearch 는 Pixel의 좌표계 설정을 따르기 때문이다.

 

그리고 사용된 ErrorLevel 은 ImageSearch 의 결과에 대한 반환 값이라고 보면 된다.

0, 1, 2 반환 값이 있으며 뜻은 아래와 같다.

0 : 이미지를 찾았을 경우

1 : 이미지를 찾지 못했을 경우

2 : 오류가 생긴 경우

 

각각 의 값에 따라서 실행되는 코드를 따로 두어야 완벽한 매크로를 만들 수 있다.

 

 

 

이제 제일 문제는 투명성이 존재한는 이미지를 찾아야 할 때이다.

위와 같은 페이지에 들어갔을 때,

팝업창이 뜨면서 매크로가 제대로 되지 않게되는데

팝업창을 없애려면 팝업창을 닫아주어야 한다.

 

팝업 광고위의 하루동안 열지않기를 누르른 것이 목표라고 할 때,

오토핫키로 어떻게 해야 저 텍스트를 인식하고 저 버튼을 누를 수 있을지 알아보자.

 

 

일단 이미지를 캡처한다.

위의 이미지를 이제 살짝 손봐줘야 한다.

 

포토샵이든 그림판에서 이미지를 불러온 다음에 검은색 또는 빨간색으로 배경을 바꿔야 한다.

필자는 빨간색으로 바꿔보았다.

 

이렇게 바꾸면 된다.

 

그다음에 코드는 아래처럼 들어가게 된다.

F8::
ImageSearch, vx, vy, 0, 0, A_ScreenWidth, A_ScreenHeight, *transFF0000 *60 test1.png
if ErrorLevel = 0
{
	MsgBox, FIND
	MouseMove, vx+50, vy+50
}
else if ErrorLevel = 1
	MsgBox, can't Find
else if ErrorLevel = 2
	MsgBox, Error
return

 

ImageSearch 의 파라미터들을 잘 살펴보면

*trasnsFF0000 *60 이 추가로 들어간 것을 확인할 수 있다.

 

16진수를 이해해야 하는데, FF 는 255 의 값을 갖는다.

RGB 색채널에서는 Red 값 0~255, Green 값 0~255, Blue 값 0~255 값을 섞어서 색을 표현한다.

 

RGB 값을 순서대로 이어붙이면 해당 색채널 값이 되는 것이다.

예를 들어 FF0000 이면 Red : 255, Green : 0, Blue : 0 이 되므로 빨간색이 되고,

00FF00 이면 녹색을 가리키며, 0000FF 는 파란색을 가리킨다.

 

따라서 *transFF0000 의 뜻은 빨간색을 제거한다는 뜻이 된다.

그리고 *60 은 오차범위를 뜻한다.

이런 경우에는 오차범위를 조금 두는 것이 필요하다.

오차범위 값을 높이게 되면 찾는데 시간이 너무 오래걸리거나 잘못된 이미지를 찾게 될 수도 있으므로 적당한 값을 찾아줘야한다.

제일 좋은 방법은 찾고자 하는 이미지 가공을 잘 해서 오차범위를 0에 근접하게 해도 잘 찾게 하는 것이다.

 

 

 

실제로 테스트해보면 정확하게 찾는 것을 확인할 수 있다.

한번에 안 될 가능성이 높으므로, 안 된다고 쉽게 포기하지 말자~

 

 

시연영상은 아래에서 확인하면 된다.

youtu.be/DygvItNioxk

 

댓글