使用PIL.ImageGrab.grab与getpixel时的坐标报错问题排查
嘿,我来帮你搞定这个问题!你遇到的报错主要是两个原因:参数格式错误和坐标体系搞混了,我给你拆解清楚:
1. 先搞懂getpixel()的参数要求
PIL里的Image.getpixel()方法,要求你传入一个包含x、y坐标的元组,而不是两个单独的数值参数!你代码里写的im.getpixel(510, 510)是错误的写法,正确的应该是im.getpixel((510, 510))——不过就算格式改对了,第一个调用还是会报错,因为还有坐标范围的问题。
2. 别混淆「原屏幕坐标」和「截取后图像的本地坐标」
ImageGrab.grab(bbox=(x1, y1, x2, y2))里的bbox用的是原屏幕的全局坐标,表示截取从左上角(x1,y1)到右下角(x2,y2)的矩形区域。而截取出来的图像im,它的坐标是从(0,0)开始的本地坐标:
im的左上角对应原屏幕的(x1,y1),也就是你例子里的(500,500)im的宽度是x2 - x1 = 600-500=100,所以x坐标的有效范围是0~99im的高度是y2 - y1 =700-500=200,所以y坐标的有效范围是0~199
你想获取原屏幕上(510,510)的像素,得把它转换成im的本地坐标:(510-500, 510-500) = (10,10),这个坐标才在im的有效范围内。
修正后的代码示例
from PIL import ImageGrab # 截取原屏幕(500,500)到(600,700)的区域 im = ImageGrab.grab(bbox=(500, 500, 600, 700)) # 正确获取原屏幕(510,510)对应的像素:转换为本地坐标+传入元组 print(im.getpixel((10, 10))) # 这个是截取图像里的(10,10),对应原屏幕(510,510),完全有效 print(im.getpixel((10, 10)))
额外提醒
bbox的四个参数遵循「左、上、右、下」的顺序,一定要注意别搞反,否则截取的区域会不符合预期哦!
内容的提问来源于stack exchange,提问作者nullptr
相关产品推荐
相关产品推荐

