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

Mat*_*ier 3 python arrays pygame colors slice

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

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

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

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

现在,我绝对确定我搞砸了数组切片。我想要做的是将所有像素的列表作为长度为 3 的颜色数组,如果该数组与 fromColor 匹配,则它切换到 toColor。但是,它不起作用,而且它不工作的速度很慢。有更容易的方法吗?

或者我只是完全误解了 surfArray 并且索引不是我认为的那样?

Dev*_*ant 5

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

arr = PixelArray(surface)
arr.replace(fromColor, toColor)
del arr
Run Code Online (Sandbox Code Playgroud)

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

至于数组切片,NumPy 文档中的解释了语法。