Pygame - 使用 SurfArray 将某种颜色的像素重新着色为另一种颜色(数组切片问题)

Pygame - Recolor pixes of a certain color to another using SurfArray (Array slicing issue)

我正在尝试为游戏制作调色板交换功能,并且正在尝试找到一种方法将某种颜色的像素颜色更改为另一种颜色。我已经能够使用我在教程中找到的这个函数使所有像素都具有相同的颜色:

def color_surface(self,surface, red, green, blue):
    arr = pygame.surfarray.pixels3d(surface)
    arr[:,:,0] = red
    arr[:,:,1] = green
    arr[:,:,2] = blue

据我所知,前两个索引是像素的位置,第三个是颜色通道,对吧?想到这里,我想到了这个功能:

def recolor(self,fromColor,toColor):
    arr = pygame.surfarray.pixels3d(self.image)
    for color in arr[:,:,0:]:
        if color == fromColor:
            color = toColor

现在,我绝对确定我弄乱了数组切片。我想要做的是将所有像素的列表作为长度为 3 的颜色数组获取,如果该数组与 fromColor 匹配,它就会切换到 toColor。但是,它不工作,而且不工作的速度非常慢。有没有更简单的方法?

还是我完全误解了 surfArray,索引不是我想的那样?

也许您正在寻找不太通用的东西,但是 PixelArray 模块中有一个 replace 方法用于将一种颜色替换为另一种颜色。

arr = PixelArray(surface)
arr.replace(fromColor, toColor)
del arr

这会将表面上的一种颜色更改为另一种颜色。 del 语句在那里,否则只要 PixelArray 对象存在,表面就会保持锁定状态。

至于数组切片,一个section in the NumPy documentation解释了语法。