使用 pyautogui,我试图在屏幕上找到图像。
这会找到图像(在分辨率为 2560x1440 的主显示器上),但需要近 5 秒:
icon1 = pyautogui.locateOnScreen('[filepath]\\icon1.png', grayscale=True)
为了减少搜索时间,我提供了一个区域参数,但这并没有找到图像。它在 ~0.7 秒内执行
icon1 = pyautogui.locateOnScreen('[filepath]\\icon1.png', region=(1500,100,950,1100), grayscale=True)
消除灰度参数不会改变结果 - 执行时间仍然约为 0.7 并且未找到图像:
icon1 = pyautogui.locateOnScreen('[filepath]\\icon1.png', region=(1500,100,950,1100))
然后我尝试将区域参数设置为整个屏幕,但是找不到图像并且执行时间约为1.5秒,因此它正在搜索(根据较长的执行时间和较大的区域来判断),只是没有找到。
icon1 = pyautogui.locateOnScreen('[filepath]\\icon1.png', region=(0,0,2559,1439))
对于接下来要尝试什么有什么建议吗?谢谢。
我知道发生了什么事。作为前言,我正在使用多个显示器,并对 pyautogui 和 pyscreeze 进行了修改,如这 2 条 pyautogui github 评论中所述: https://github.com/asweigart/pyautogui/issues/9#issuecomment-527236475 https://github.com/asweigart/pyautogui/issues/321#issuecomment-629819495
通过这些修改,pyautogui 可与多个显示器配合使用,并且
pyautogui.position()
和 pyautogui.moveTo()
将主显示器的左上角视为坐标 (0,0) - 这意味着主显示器上方或左侧的显示器将具有至少一个负坐标。
但是 pyscreeze 返回的图像搜索结果是基于将左上角显示器的左上角视为坐标(0,0) - 因此扩展桌面上的所有坐标都是正值。
我传递给
locateOnScreen()
的区域参数基于使用 pyautogui.position()
报告的坐标,因此搜索是在屏幕的错误区域上执行的。
一旦我弄清楚了这一点,我就能够通过正确的区域规范。
为了说明这一点,我在 pyscreeze 中插入了一条 print 语句来显示在哪里找到图像。以及图像搜索返回的打印。在我的代码中,我打印了 pyautogui.position()。
retVal = Box(left=8008, top=3171, width=29, height=31)
Point(x=4182, y=1026)
mouse position:
Point(x=4182, y=1026)
所以你可以看到坐标有很大不同。 Pyscreeze 显示基于 0,0 是左上角显示器左上角的坐标,而图像搜索返回变量是基于 0,0 是主显示器左上角的坐标,所以我能够获取图像搜索结果变量并将其传递给
pyautogui.moveTo()
并将鼠标移动到那里(moveTo 需要基于 0,0 主监视器左上角的坐标)。
问题源于两个不同人对 pyautogui 和 pyscreeze 的更改。我想我可以调整对这些包之一的更改以偏移坐标,以便两者都将同一显示器的左上角引用为坐标 (0,0)。
您的地区设置错误。使用 (0,0,2559,1439)。
如果这不起作用,请创建一个新的屏幕截图并指定其区域,保存它并查看是否可以在屏幕上找到刚刚捕获的屏幕截图。
下面的代码应该始终按预期工作:
from time import perf_counter as T
import pyautogui
# NOTICE that in pyautogui: region=(left, top, width, height)
pyautogui.screenshot('pyautogui_region_screenshot.png', region=(300, 500, 300, 200))
sT = T()
img = pyautogui.locateOnScreen('pyautogui_region_screenshot.png', region=(300, 500, 300, 200))
eT = T()
print(f'img = pyautogui.locateOnScreen took: {eT-sT:9.5f} seconds')
print(img)
顺便说一句:查看 https://stackoverflow.com/questions/72410958/take-a-screenshot-of-a-specific-portion-of-the-screen-in-python 切换到另一个 Python 模块( mss ) 用于对屏幕的小区域进行屏幕截图。
我在模块 pyscreeze 中遇到了同样的问题,我尝试将 Pillow 包版本从 11.0.0 降级到 10.4.0 并且成功了。