AutoOnmyoji
核心逻辑
实现原理
win32api, win32con, win32gui, win32ui
核心API
窗口截图(后台)
def window_full_shot(self, file_name=None):
self.hwnd = win32gui.FindWindow(0,window_name)
"""
窗口截图
:param file_name=None: 截图文件的保存名称
:return: file_name为空则返回RGB数据
"""
try:
l, t, r, b = win32gui.GetWindowRect(self.hwnd)
#39和16为Window与Client高和宽的差值
h = b - t - 39
w = r - l - 16
hwindc = win32gui.GetWindowDC(self.hwnd)
srcdc = win32ui.CreateDCFromHandle(hwindc)
memdc = srcdc.CreateCompatibleDC()
bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, w, h)
memdc.SelectObject(bmp)
memdc.BitBlt((0, 0), (w, h), srcdc, (8, 31), win32con.SRCCOPY)
if file_name!=None:
bmp.SaveBitmapFile(memdc,file_name)
srcdc.DeleteDC()
memdc.DeleteDC()
win32gui.ReleaseDC(self.hwnd, hwindc)
win32gui.DeleteObject(bmp.GetHandle())
return
else:
signedIntsArray = bmp.GetBitmapBits(True)
img = np.fromstring(signedIntsArray, dtype='uint8')
img.shape = (h, w, 4)
srcdc.DeleteDC()
memdc.DeleteDC()
win32gui.ReleaseDC(self.hwnd, hwindc)
win32gui.DeleteObject(bmp.GetHandle())
return cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
except:
pass
区域截图(后台)
def window_part_shot(self, pos1, pos2, file_name=None):
"""
窗口区域截图
:param pos1: (x,y) 截图区域的左上角坐标
:param pos2: (x,y) 截图区域的右下角坐标
:param file_name=None: 截图文件的保存路径
:return: file_name为空则返回RGB数据
"""
w = pos2[0] - pos1[0]
h = pos2[1] - pos1[1]
hwindc = win32gui.GetWindowDC(self.hwnd)
srcdc = win32ui.CreateDCFromHandle(hwindc)
memdc = srcdc.CreateCompatibleDC()
bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, w, h)
memdc.SelectObject(bmp)
memdc.BitBlt(
(0, 0), (w, h), srcdc, (pos1[0] + 8, pos1[1] + 31), win32con.SRCCOPY
)
if file_name != None:
bmp.SaveBitmapFile(memdc, file_name)
srcdc.DeleteDC()
memdc.DeleteDC()
win32gui.ReleaseDC(self.hwnd, hwindc)
win32gui.DeleteObject(bmp.GetHandle())
return
else:
signedIntsArray = bmp.GetBitmapBits(True)
img = np.fromstring(signedIntsArray, dtype="uint8")
img.shape = (h, w, 4)
srcdc.DeleteDC()
memdc.DeleteDC()
win32gui.ReleaseDC(self.hwnd, hwindc)
win32gui.DeleteObject(bmp.GetHandle())
return cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
颜色查找
def check_color(self, pos, color, tolerance=0):
"""
对比窗口内某一点的颜色
:param pos: (x,y) 欲对比的坐标
:param color: (r,g,b) 欲对比的颜色
:param tolerance=0: 容差值
:return: 成功返回True,失败返回False
"""
img = Image.fromarray(self.window_full_shot(), "RGB")
r1, g1, b1 = color[:3]
r2, g2, b2 = img.getpixel(pos)[:3]
if (
abs(r1 - r2) <= tolerance
and abs(g1 - g2) <= tolerance
and abs(b1 - b2) <= tolerance
):
return True
else:
return False
图片查找
原理采用:cv2.TM_CCOEFF_NORMED
def find_img(self, img_template_path):
"""
查找图片
:param img_template_path: 欲查找的图片路径
:return: (maxVal,maxLoc) maxVal为相关性,越接近1越好,maxLoc为得到的坐标
"""
img_src_path = "tmp\\full.png"
self.window_full_shot(img_src_path)
img_src = cv2.imread(img_src_path, 0)
img_template = cv2.imread(img_template_path, 0)
res = cv2.matchTemplate(img_src, img_template, cv2.TM_CCOEFF_NORMED)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(res)
return maxVal, maxLoc