在我正在编写的 pygame 应用程序中,我使用 Surface.set_at() 和 get_at() 方法直接操作像素。它不是时间敏感的,所以没有问题。但我看到一些奇怪的行为。在被要求组装一个 mcve 之后,我确定了发生问题的确切情况。我的代码:
import pygame
def is_color(surface,position,color):
col=surface.get_at(position)
return (col.r,col.g,col.b)==color
def flood_fill(surface, position, fill_color):
frontier = [position]
fill=pygame.Color(fill_color[0],fill_color[1],fill_color[2],255)
n=0
while len(frontier) > 0 and n<50000:
x, y = frontier.pop()
try:
col=surface.get_at((x,y))
if is_color(surface,(x,y),fill_color):
continue
except IndexError:
continue
surface.set_at((x,y),fill)
n+=1
frontier.append((x + 1, y))
frontier.append((x - 1, y))
frontier.append((x, y + 1))
frontier.append((x, y - 1))
ROOD = (150,0,0)
pygame.init()
screen=pygame.display.set_mode((200,200))
colors=pygame.Surface((200,200))
pygame.draw.circle(colors,ROOD,(50,50),20,2)
pygame.draw.circle(colors,ROOD,(150,150),20,2)
flood_fill(colors,(50,50),ROOD)
pygame.image.save(colors,"circles.png")
del colors
colors=pygame.image.load("circles.png")
flood_fill(colors,(150,150),ROOD)
screen.blit(colors,(0,0))
pygame.display.flip()
当我按原样运行(Windows 10)时,第一个圆圈被填充,第二个填充操作失败。问题似乎在于从 PNG 文件中读取:当我将文件名更改为 circles.bmp 时,没问题。所以我现在有一个解决方法。这是PNG文件处理中的一个错误,还是我错过了这些东西应该如何工作的微妙之处?