일단 관련글들이 있으나 , 부분부분있기때문에 제가 얼마동안 이것저것 해본것들을 정리도해볼겸
자유게시를 합니다.
내용은 거의 모두 현 게시판에서 질답으로 제가 질문드린 내용들에 대해 답변을 주신것들입니다. 모두감사요
(답변주신분들 열거하려다가, 이게뭐라고 생각되어 궁금하신분들은 그냥 검색해보세요.)
혹시 보시고 틀린 부분이나 , 이렇게 하면 더 좋다는 부분은 말씀주시면 고맙겠습니다..^^
#Include Gdip.ahk
#Include Gdip_ImageSearch.ahk
F4::
WinGetActiveTitle,Title
RegExMatch(Title,"(\d{3}\.\d*\.\d*\.\d*)",b)
ip="%b%:5555"
SysGet, border, 32
SysGet, caption, 4
count:=
return
F1::
if (GSearch("이미지이름")) ;찾을이미지이름,따옴표로묶음.png생략 ex: abc.png ,기본 전체이미지,검색률80
{
?? GTouch() ; 위에서 찾은 이미지 터치
}
;======================
; 이미지 찾을 좌표 범위지정시
if (GSearch("이미지이름",10,10,30,30,100,0x000000))? ; 0x000000 은 블랙 투명처리,생략해도됨
??????????????????????????????????????????????????????????????????????? ;if (GSearch(이미지이름,10,10,30,30))
{
?? GTouch() ; 위에서 찾은 이미지 터치
}
;=======================
;윈도우스파이를 보고 좌표직접입력 터치
Touch(50,50) ; 단점 adb 명령어를 이용하기 때문에 터치속도가 현저히느리다.
;=======================
PTouch(50,50) ; 포스트메시지터치,빠르게 터치가능
return
;========================함수처리
GSearch(img,gx=0,gy=0,gw=0,gh=0,per=80,trans="") ; 이미지명,x,y,w,h좌표,per검색률,trans투명처리
{
global ip,bmpHaystack,bmpNeedle,border,caption,vx,vy
RunWait, adb.exe -s %ip% shell screencap -p /sdcard/bg.png,,hide
RunWait, adb.exe -s %ip% pull /sdcard/bg.png,,hide
; 오토잇윈도우스파이로 좌표입력했을때 기준
if (gx != 0)
gx := gx - border
if (gy != 0)
gy := gy - border - caption
if (gw != 0)
gw := gw - border
if (gh != 0)
gh := gh - border - caption
gdipToken := Gdip_Startup()
bmpHaystack := Gdip_CreateBitmapFromFile("bg.png")
Gdip_ImageRotateFlip(bmpHaystack, 3) ;------ 같은화면에서 여러이미지 찾을시 이부분까지 편집수정필요
bmpNeedle := Gdip_CreateBitmapFromFile("img\"img ".png")
RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,GXY,gx,gy,gw,gh,per,trans,1,1)
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
StringSplit,gxy,GXY,`,
vx :=gxy1
vy := gxy2
IF (RET)
{
?return true
}
}
Touch(adbx,adby) ; 윈도우스파이좌표입력기준 터치
{
global ip,border,caption
x := adbx - border
y := adby - border - caption
RunWait, adb.exe -s %ip% shell input tap %x% %y%,,hide
Sleep, 200
}
GTouch() ; 찾은이미지 터치
{
global ip,gxy
StringSplit,xy,gxy,`,
RunWait, adb.exe -s %ip% shell input tap %xy1% %xy2%,,hide
Sleep, 200
}
PTouch(px,py) ; 윈도우스파이좌표기준, 포스트메시지터치
{
global Title,ip,border,caption
px :=?px - border
py :=?py - border - caption
pm:=px|py<<16
PostMessage, 0x201, 0, %pm%,,%Title%
PostMessage, 0x202, 0, %pm%,,%Title%
Sleep,10
}
esc::
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
EXITAPP
정리해보면 , 위 방식은 adb에서 캡쳐한파일을 pc로 가져와서 그 파일을 기준으로 서칭하는방식이라
속도가 상당히 느린편입니다.
일반적으로 한 화면내에서 한번 이미지서칭시에는 속도가 1초정도 느려도 감내할수있으나,
한화면에서 여러이미지를 수십번 검색하거나, 피게이지처럼 실시간 감시할경우 느려서 힘듭니다.
이런?한화면내 루프서칭시?adb캡쳐를 수정하셔야합니다.
처음에 한번만 캡처부분을 해주시고, 다음 루프부터는 찾을이미지서칭만 해야합니다.
그래야 중복해서 같은 배경이미지를 계속 캡쳐하지 않겠지요.
그래도 1초이상의 지연은 어쩔수가 없더군요. 제가 하던 coc 자원서칭의 경우는
한 화면에서 서칭이 20번이상이루어지기때문에 , 한컷당 2초이상소모가되어버리네요.(adb캡처1~1.5초,서칭1초)
이문제를 해결하려면 역시 , 블루스택에 disp를 쓰는게 나은거 같습니다.? (이부분은 검색하면나옵니다)
블루스택이 지니모션보다 편의상(?) 좀 안좋은게 탈이에요.
위 방식 사용시 단점 : 속도 , 이미지파일 디스크에 쓰고지우기 반복으로 인한 소모?
장점 : 화면 가리거나,투명화, 화면크게 작게 해도 지장없이 서칭이 가능(작업표시줄 최소화는 안됨)
???????? (화면안보이는곳으로 보낸다거나 하는 팁은 매크로맨서님 글이 잇을겁니다.)
================
대략 여기까지이며 , 제가 궁금한부분이 있는데 , 어느정도 짐작하는 부분입니다.
아직 함수사용이 미숙하여 애매한 명령어들이 있습니다.
global 지정할 경우 함수내외에서 지정한 변수를 사용할수 있게되는것으로 압니다.
global지정을 여러개 할 경우 중복된 처리로 꼬일거 같은 느낌이 드네요.
disp명령어에서 메모리할당된 이미지 삭제 부분인데요.
위 소스에서 보듯이 잴하단부에?종료시 Gdip_DisposeImage로 메모리할당된 이미지를 삭제처리해두었습니다.
이 경우, 이미지변수 역시 global지정을 해야할까싶네요. 제가 테스트해본결과 global지정을 안하면 이미지인식이
안되더군요. 아래처럼 해야하는것인지 모호하네요.
clear()
{
global bmpHaystack,bmpNeedle? ; global 선언을해야하는가
Gdip_DisposeImage(bmpHaystack)
Gdip_DisposeImage(bmpNeedle)
Gdip_Shutdown(gdipToken)
}
또한 한 화면내 여러이미지 서칭시 gdipToken := Gdip_Startup() 한번 주고 서칭을 반복할때는 넣지않고
이후 마지막 클리어할때 아래처럼 Gdip_Shutdown(gdipToken) 해도 되겠죠?
현재 여러 이미지 루프서칭시 한이미지서칭끝날경우 별도로 Gdip_DisposeImage(bmpHaystack)로 그때그때
메모리에서 찾을이미지를 삭제해주고있습니다.
위 소스에는 참조변수인 byref는 사용하지 않았는데요.
본문에서 함수쓸때 타이핑 최소화를 위해서 byref를 global로 대체를 하였는데 왠지 꼬일까 불안하네요.
참고 하실분들은 참고 하시고 , 제질문꼼꼼히 답변주셧던 분들감사드립니다.