在pygame中填充给定的颜色

时间:2013-08-02 12:00:59

标签: python image colors pygame

我的目标是创建一个名为findList()的函数,它保存一个点和屏幕表面的给定参数。

我的目标是计算该点的颜色,然后返回填充颜色的列表。

例如,如果其中一个屏幕上有一个红色圆圈并且该点位于红色圆圈内,我希望能够返回一个包含该圆圈所有点的列表。

基本上,这个点会扩展,避开所有其他颜色和屏幕边缘,直到它不再扩展为止;然后函数返回所有创建的点的列表。

这是我试过的:

def findList(point,screen):
    directions=[(0,0)]
    myList=[]
    myList.append(point)
    startColour=screen.get_at(point)
    i=0
    loop=0
    while True:
        loop=loop+1
        print(loop)
        directions=[]
        print("Length of myList: "+str(len(myList)))
        for i in range(len(myList)):
            if myList[i][0]+1<WINDOWWIDTH and screen.get_at((myList[i][0]+1,myList[i [1]))==startColour and myList[i][0]+1 not in myList and myList[i][0]+1 not in directions:
                directions.append((myList[i][0]+1,myList[i][1]))
            if myList[i][0]-1>0 and screen.get_at((myList[i][0]-1,myList[i][1]))==startColour and myList[i][0]-1 not in myList and myList[i][0]-1 not in directions:
                directions.append((myList[i][0]-1,myList[i][1]))
            if myList[i][1]+1<WINDOWHEIGHT and screen.get_at((myList[i][0],myList[i][1]+1))==startColour and myList[i][1]+1 not in myList and myList[i][1]+1 not in directions:
                directions.append((myList[i][0],myList[i][1]+1))
            if myList[i][1]-1>0 and screen.get_at((myList[i][0],myList[i][1]-1))==startColour and myList[i][1]-1 not in myList and myList[i][1]-1 not in directions:
                directions.append((myList[i][0],myList[i][1]-1))

        print(len(directions))
        for i in directions:
            myList.append(i)
        if len(directions)==0:
            break
    print("Exited loop.")
    return myList

我知道编码风格很糟糕,其中大部分内容可能都没用,但一般的问题是功能(可能)有效但速度很慢,而且似乎添加了之前添加的像素很多,直到我可怜的小上网本不能再使用应对它正在使用的10万点。

如果有人可以为更好的功能提出一些建议,这对我的程序真的很有帮助,因为只有13,我对这个混乱的代码感到非常困惑(请注意ifs中的4个条件)。

1 个答案:

答案 0 :(得分:0)

基本上,您要求的是“Flood-Fill”算法的第一部分,即Microsoft Paint等程序用于填充具有新颜色的区域。该算法首先找到相同颜色的所有连接像素,然后改变它们的颜色。查看wikipedia page或此stackoverflow question以获取python实现。

至于你的代码,有几件事可以改进。我建议:

  1. 使用set()代替列表。这样您就不必处理重复点
  2. 仅使用if/elif子句代替if。这将减少计算时间。
  3. 您的if语句非常复杂但非常冗余。您可能希望尝试将它们分解为if/elif语句的嵌套组。
  4. 查看Flood-Fill算法并尝试重写您拥有的内容。查看其他一些示例可能会帮助您显着简化代码。