You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何用ImageGrab检测全屏任意位置指定颜色并定位

全屏指定颜色检测+鼠标移动实现方案

你之前写的逻辑只遍历了x、y轴0到100范围、步长10的像素,实际只覆盖了屏幕左上角100*100的极小区域,自然做不到全屏检测。完整实现按下面的逻辑走就行:

核心实现步骤

  • 全屏截图:ImageGrab.grab()不传bbox参数时默认截取整个显示器画面,截图后直接读取图片对象的size属性就能拿到全屏实际分辨率,不用硬编码宽高
  • 颜色匹配:不同系统截图返回的像素可能是RGB三通道或RGBA四通道格式,比对时统一取前三个通道值即可;如果允许抗锯齿、压缩带来的小幅色差,可以设置颜色容差,不需要色值完全相等才判定命中
  • 性能优化:逐像素遍历速度较慢,可以先设置较大的扫描步长粗定位,找到疑似区域后再缩小步长精扫;也可以先调用图片对象的getcolors()方法快速判断目标色是否存在,不存在直接跳过遍历减少无效计算
  • 鼠标移动:匹配到目标坐标后,调用pyautogui的移动方法即可把鼠标移到对应位置,多屏场景注意核对坐标原点对应主屏左上角即可

可直接运行的参考代码

from PIL import ImageGrab
import pyautogui

# 自定义配置
TARGET_RGB = (255, 0, 0)  # 要查找的目标颜色,示例为纯红色
TOLERANCE = 10  # 颜色匹配容差,0为完全精准匹配
SCAN_STEP = 5  # 扫描步长,值越大扫描速度越快、精度越低

# 截取全屏并读取像素矩阵
screen = ImageGrab.grab()
width, height = screen.size
pixel_map = screen.load()

target_pos = None
# 按步长遍历全屏
for y in range(0, height, SCAN_STEP):
    for x in range(0, width, SCAN_STEP):
        # 兼容RGBA格式,仅取RGB三通道
        r, g, b = pixel_map[x, y][:3]
        tr, tg, tb = TARGET_RGB
        # 色差判断
        if abs(r-tr) <= TOLERANCE and abs(g-tg) <= TOLERANCE and abs(b-tb) <= TOLERANCE:
            target_pos = (x, y)
            break
    if target_pos:
        break

if target_pos:
    print(f"命中目标颜色,坐标:{target_pos}")
    pyautogui.moveTo(target_pos[0], target_pos[1])
else:
    print("全屏未检测到匹配颜色")

注意事项

  • 运行前先安装依赖:pip install pillow pyautogui
  • macOS系统需要给运行代码的终端/IDE开启屏幕录制权限,否则截图会是全黑无法读取正确像素
  • 如果有高速扫描需求,可以把PIL替换为mss库做截图,截图速度比PIL快3-5倍,适合高频轮询检测的场景
  • 如果需要获取所有匹配点坐标,去掉找到第一个点就break的逻辑,用列表存储所有命中坐标即可

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:33:33