我的知识记录

Python 读取屏幕像素颜色:pyautogui 取色器与监控

Python 用 pyautogui 读取屏幕指定坐标或鼠标位置的 RGB 颜色,做屏幕取色、颜色变化监控、UI 自动化判色,给出完整代码和多显示器注意事项。

场景痛点

做 UI 自动化要判断按钮是否变成灰色、做游戏脚本要判断画面某个点是不是变了、做设计要取屏幕上某个色值,靠肉眼看色不准,靠截图再用画图取色太慢。Python 直接读屏幕上任意坐标的 RGB 值,毫秒级返回,还能持续监控某个点的颜色变化。

用到的库

pip install pyautogui

完整代码

import time
from datetime import datetime
import pyautogui


def get_pixel_color(x, y):
"""读取屏幕指定坐标的 RGB 颜色"""
r, g, b = pyautogui.pixel(x, y)
print(f"坐标 ({x}, {y}) 颜色 = RGB({r}, {g}, {b})  "
f"HEX=#{r:02X}{g:02X}{b:02X}")
return (r, g, b)


def get_mouse_color():
"""读取当前鼠标位置的颜色,方便手动移到目标点后按回车取色"""
x, y = pyautogui.position()
return get_pixel_color(x, y)


def watch_pixel(x, y, target_rgb, interval=1.0, timeout=60):
"""监控某点颜色,变成 target_rgb 就返回,否则超时退出"""
print(f"开始监控 ({x},{y}),等待颜色变成 {target_rgb},最长 {timeout} 秒")
start = time.time()
while time.time() - start < timeout:
r, g, b = pyautogui.pixel(x, y)
if (r, g, b) == tuple(target_rgb):
print(f"[{datetime.now()}] 颜色匹配!"
f"RGB({r},{g},{b})")
return True
time.sleep(interval)
print("超时,颜色未匹配。")
return False


def main():
# 1. 读取屏幕中心一点的颜色
sw, sh = pyautogui.size()
get_pixel_color(sw // 2, sh // 2)

# 2. 读鼠标当前位置
get_mouse_color()

# 3. 监控某点颜色变化(示例:等 (100,100) 变成黑色)
# watch_pixel(100, 100, (0, 0, 0), interval=0.5, timeout=10)


if __name__ == "__main__":
main()

代码讲解

  • pyautogui.pixel(x, y) 返回一个 (r, g, b) 三元组,取值范围 0-255,坐标原点在屏幕左上角。
  • pyautogui.size() 返回主屏分辨率 (width, height),中心坐标就是 (w//2, h//2)
  • pyautogui.position() 返回当前鼠标位置 (x, y),配合 pixel 就能做"鼠标指哪读哪"的取色器。
  • watch_pixel 是典型的颜色监控:循环读像素,匹配到目标色就立刻返回,常用于"按钮变亮了再点击"这种 UI 自动化逻辑。
  • HEX 颜色用 f"#{r:02X}{g:02X}{b:02X}" 格式化,可以直接贴进 CSS 或设计稿。

运行结果

运行后控制台依次输出屏幕中心点和鼠标位置的 RGB 与 HEX 值,例如:

坐标 (960, 540) 颜色 = RGB(255, 255, 255)  HEX=#FFFFFF
坐标 (1234, 567) 颜色 = RGB(50, 150, 255)  HEX=#3296FF

打开 watch_pixel 注释后,把鼠标移到某个按钮上,按钮变色时会立刻打印"颜色匹配"。

注意事项

  • pyautogui.pixel 每次调用都要截屏一次,高频调用(毫秒级)会拖慢系统,监控间隔建议 ≥ 0.1 秒。
  • 多显示器下坐标只对主屏有效;副屏需要用 mss 库或 PIL.ImageGrab.grab(all_screens=True)
  • 颜色抗锯齿会导致边缘像素不是纯色,判断时建议加容差:
def close(a, b, tol=5):
return all(abs(x - y) <= tol for x, y in zip(a, b))
  • 远程桌面、全屏游戏、加密视频播放器可能读不到真实颜色,返回全黑。
  • Mac 上需要在"系统偏好设置→安全性→辅助功能"里给终端授权,否则读不到像素。

Python 读取屏幕像素颜色:pyautogui 取色器与监控

标签:

更新时间:2026-09-14 20:35:59

上一篇:Python 屏幕截图教程:pyautogui 全屏与区域截图

下一篇:Python schedule 定时任务执行教程:轻量级任务调度入门