如何使用Python的PIL在特定区域查找屏幕上的某个像素颜色?

2 投票
1 回答
1250 浏览
提问于 2025-04-18 02:35

我想知道怎么用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循环。试试这个。这就是为什么它打印出那种奇怪的类型,因为你返回的就是那个东西!

撰写回答