如何使用Python的PIL在特定区域查找屏幕上的某个像素颜色?
我想知道怎么用Python的PIL库在屏幕的特定区域查找某个像素的颜色。
我需要一个函数,如果在预先设定的区域内出现了某个像素颜色,就能在Python 2.7中启动一个命令。我试过以下代码,但没有成功:
def game_one():
box = (x_pad+1, y_pad+1, x_pad+1179, y_pad+474)
im = ImageGrab.grab(box)
return im
rgb_im = im.convert('RGB')
for x in range(1055, 1120, 1):
for y in range(20, 464, 1):
pix = rgb_im.getpixel((x, y))
if pix != (255,0,255):
startPlaying()
time.sleep(.2)
clickbuttonone()
print "Pixel Found!"
else:
print "Waiting for pixel to appear"
(x_pad和y_pad是预先定义的屏幕变量,跟问题无关,但有助于捕捉整个屏幕)
ImageOps和Image已经导入,还有win32api和win32con。
非常感谢!
1 个回答
0
要一直搜索直到找到像素,你可以使用一个循环。不过,这样做本质上会变成一个无限循环,这样是不好的做法。我这里加了一个超时设置,设定为120秒(2分钟),你可以根据需要调整这个时间。
import time
pf = False #check if pixel was found
start_time = time.time()
def game_one():
box = (x_pad+1, y_pad+1, x_pad+1179, y_pad+474)
im = ImageGrab.grab(box)
# return im
rgb_im = im.convert('RGB')
while (pf == False) and ((time.time()-start_time) < 120):
for x in range(1055, 1120, 1):
if pf == True:
break
for y in range(20, 464, 1):
pix = rgb_im.getpixel((x, y))
if pix != (255,0,255):
startPlaying()
time.sleep(.2)
clickbuttonone()
print "Pixel Found!"
pf = True
break
else:
print "Waiting for pixel to appear"
另外,确保你检查一下代码的缩进——这可能只是为了在这个网站上发布的格式,但函数的定义不应该和函数的其他部分在同一行。
编辑:好的,我想我找到了主要的问题。你看到我注释掉的return im
了吗?返回语句会结束你的函数,之后的内容就不会被处理了。你的代码甚至没有执行到for
循环。试试这个。这就是为什么它打印出那种奇怪的类型,因为你返回的就是那个东西!