You need to enable JavaScript to run this app. 已知像素RGB值如何获取其坐标?屏幕指定区域像素识别点击代码报索引越界错误
优惠活动
大模型
产品
解决方案
定价
更多

已知像素RGB值如何获取其坐标?屏幕指定区域像素识别点击代码报索引越界错误

报错根源

ImageGrab.grab(bbox=(left, top, right, bottom)) 生成的截图,使用截取区域内的本地坐标系,而非全局屏幕坐标系:

  • 截图的像素原点(0,0)对应bbox的左上角全局坐标(268, 118)
  • 截图可索引的X坐标范围是 0 ~ (1150-268-1) = 0~881,因为截图宽度为882,数组索引从0开始计数
  • 截图可索引的Y坐标范围是 0 ~ (866-118-1) = 0~747,因为截图高度为748,数组索引从0开始计数

直接用全局屏幕坐标的数值调用im.getpixel(),传入的索引值远大于截图本身的索引上限,必然触发越界报错。

修复逻辑

需要明确区分本地截图坐标和全局屏幕坐标的映射关系,调整遍历的参数和边界判断:

  • 遍历检测像素时,使用本地坐标查询截图内容
  • 找到目标像素后,加上bbox的左上角偏移量,转换成全局屏幕坐标再执行点击
  • 参考修正代码:
from PIL import ImageGrab
import pyautogui
import sys

# 定义截图区域边界
BBOX_LEFT = 268
BBOX_TOP = 118
BBOX_RIGHT = 1150
BBOX_BOTTOM = 866

im = ImageGrab.grab(bbox=(BBOX_LEFT, BBOX_TOP, BBOX_RIGHT, BBOX_BOTTOM))
# 计算截图本地索引的上限
LOCAL_BOUND_X = BBOX_RIGHT - BBOX_LEFT - 1
LOCAL_BOUND_Y = BBOX_BOTTOM - BBOX_TOP - 1

local_x = 0
local_y = 0
step = 5
target_rgb = (0, 158, 187)

while True:
    # 用本地坐标检测像素
    if im.getpixel((local_x, local_y)) == target_rgb:
        # 转换为全局坐标执行点击
        click_global_x = BBOX_LEFT + local_x
        click_global_y = BBOX_TOP + local_y
        pyautogui.click(click_global_x, click_global_y)
        break
    # 按步长横向移动
    local_x += step
    # 横向到达边界就换行
    if local_x > LOCAL_BOUND_X:
        local_x = 0
        local_y += step
    # 纵向到达边界就退出
    if local_y > LOCAL_BOUND_Y:
        sys.exit()
常见补全调整
  • 原代码未导入sys模块,直接运行到退出逻辑会触发NameError,需要提前导入
  • 原代码的循环逻辑是先对X做+5操作再检测,会漏掉bbox左上角第一个像素的校验,修正后从本地坐标(0,0)开始遍历即可覆盖全区域
  • 如果系统开启了显示缩放(如Windows设置125%/150%缩放),需要在ImageGrab调用时增加bbox_xr=True参数,否则坐标映射会出现偏移,导致点击位置不准

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 23:45:03