-
오토핫키 기존 PixelSearch 보다 1.6배 빠른 pixelsearch오토핫키/라이브러리 2022. 4. 30. 15:45
https://open.kakao.com/me/apsalman
https://www.youtube.com/channel/UC6hW-NrL9CxDQd2IzWbekYA
px(color) { static hdc, hbm, obm, pBits if !hdc { ; struct BITMAPINFOHEADER - https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapinfoheader hdc := DllCall("CreateCompatibleDC", "ptr", 0, "ptr") VarSetCapacity(bi, 40, 0) ; sizeof(bi) = 40 NumPut( 40, bi, 0, "uint") ; Size NumPut(A_ScreenWidth, bi, 4, "uint") ; Width NumPut(-A_ScreenHeight, bi, 8, "int") ; Height - Negative so (0, 0) is top-left. NumPut( 1, bi, 12, "ushort") ; Planes NumPut( 32, bi, 14, "ushort") ; BitCount / BitsPerPixel hbm := DllCall("CreateDIBSection", "ptr", hdc, "ptr", &bi, "uint", 0, "ptr*", pBits:=0, "ptr", 0, "uint", 0, "ptr") obm := DllCall("SelectObject", "ptr", hdc, "ptr", hbm, "ptr") } ; Retrieve the device context for the screen. static sdc := DllCall("GetDC", "ptr", 0, "ptr") ; Copies a portion of the screen to a new device context. DllCall("gdi32\BitBlt" , "ptr", hdc, "int", 0, "int", 0, "int", A_ScreenWidth, "int", A_ScreenHeight , "ptr", sdc, "int", 0, "int", 0, "uint", 0x00CC0020 | 0x40000000) ; SRCCOPY | CAPTUREBLT static bin := 0 if !bin { ; C source code - https://godbolt.org/z/oYx39nr5s code := (A_PtrSize == 4) ? "VYnli1UIi0UMi00QjQSCOcJzDTkKdQSJ0OsFg8IE6+9dww==" : "idJIjQSRSDnBcw9EOQF1BInI6wZIg8EE6+zD" padding := (code ~= "==$") ? 2 : (code ~= "=$") ? 1 : 0 size := 3 * (StrLen(code) / 4) - padding bin := DllCall("GlobalAlloc", "uint", 0, "uptr", size, "ptr") DllCall("VirtualProtect", "ptr", bin, "ptr", size, "uint", 0x40, "uint*", old:=0) DllCall("crypt32\CryptStringToBinary", "str", code, "uint", 0, "uint", 0x1, "ptr", bin, "uint*", size, "ptr", 0, "ptr", 0) } ; Pass the width * height, but the size is returned due to C interpreting Scan0 as a integer pointer. ; So when doing pointer arithmetic, *Scan0 + 1 is actually adding 4 bytes. byte := DllCall(bin, "ptr", pBits, "uint", A_ScreenWidth * A_ScreenHeight, "uint", color, "int") if (byte == pBits + A_ScreenWidth * A_ScreenHeight * 4) throw Exception("pixel not found") x := mod((byte - pBits) / 4, A_ScreenWidth) y := ((byte - pBits) / 4) // A_ScreenWidth return {x:x, y:y} }
기존 픽셀서치보다 1.6배 빠른 px 라이브러리 입니다.
출처 : https://www.autohotkey.com/boards/viewtopic.php?t=101819
함수명 px
매개 변수 color
예) px("0xFFFF0080")
color 에는 무조건 0xFF 로 시작해서 RGB 가 들어가야 합니다.
'오토핫키 > 라이브러리' 카테고리의 다른 글
오토핫키 PixelSearch 픽셀서치 타겟팅 찾은 것만 찾기 (0) 2022.05.08 오토핫키 제법 사람처럼 움직이는 마우스 MouseMove 함수 (0) 2022.05.07 오토핫키 ImageSearch 를 대신할 FindText (12) 2022.05.01 오토핫키 멀티 이미지서치 / 다중 이미지서치 / 여러개 동시에 이미지 서치 (1) 2022.04.26 오토핫키 가우시안 정규분포 (4) 2022.03.01