Python 需要帮助了解surfarray.array2d-它似乎无法正确保存颜色

Python 需要帮助了解surfarray.array2d-它似乎无法正确保存颜色,python,pygame,Python,Pygame,我做了一个测试,我将一个曲面转换为一个array2d,然后将它转换回来,如下所示: fg = pygame.surfarray.make_surface(pygame.surfarray.array2d(fg)) 这是完整的代码(如果愿意,您可以复制并粘贴到Pygame中进行快速测试): 按s键时,原始棕色变为绿色 旧颜色:(70、53、52、255) 新颜色:(851820255) 解决这个问题的方法是使用array3d,但我不明白为什么会这样。有人能给我解释一下吗?非常感谢 参考:函数py

我做了一个测试,我将一个曲面转换为一个array2d,然后将它转换回来,如下所示:

fg = pygame.surfarray.make_surface(pygame.surfarray.array2d(fg))
这是完整的代码(如果愿意,您可以复制并粘贴到Pygame中进行快速测试):

按s键时,原始棕色变为绿色

旧颜色:(70、53、52、255)
新颜色:(851820255)

解决这个问题的方法是使用array3d,但我不明白为什么会这样。有人能给我解释一下吗?非常感谢


参考:

函数
pygame.surfarray.make_surface
将2D数组转换为位深为8的曲面,3D数组转换为位深为32的曲面。这很重要,因为pygame如何处理位深度

钻头深度 位深度是表示颜色的信息量。32位深度允许我们表示
2^32=4294967296
颜色,这与为每个颜色分量(红色、绿色、蓝色、Alpha)分配8位(0-255之间的值)相同

位深度8允许我们表示
2^8=256
颜色。这将是每个颜色分量的2位(0-3之间的值)。然而,这不是pygame处理这种深度颜色的方式

pygame是如何处理的 Pygame不存储RGBA的每个值,而是将像素存储为单个整数,只要位深度大于8,就可以对该整数进行解码以获取颜色分量的值。当您有较低的位深度时,pygame会为曲面使用调色板。现在,每个像素值都成为256色调色板的索引,而不是编码的整数。此选项板可通过方法使用,并可使用设置

正是这种转换使你的颜色值变得怪异。下面是一个演示和实验的简短程序(使用控制台,从32位深度开始,通过键入逗号和/或空格分隔的值来选择颜色):

pygame.init()


SURFACE_MAIN = pygame.display.set_mode((300, 300))
fg = pygame.Surface((300, 300))
fg.fill((70, 53, 52))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_s:
                fg = pygame.surfarray.make_surface(pygame.surfarray.array2d(fg))

    SURFACE_MAIN.blit(pygame.Surface.copy(fg), (0, 0))
    pygame.display.update()
import pygame
pygame.init()

screen = pygame.display.set_mode((1, 1))

depth = int(input('\nDepth size: '))
color = [int(x) for x in input('Color: ').replace(',', ' ').split()]

surface = pygame.Surface((1, 1), depth=depth)  # Valid bit depth sizes are 8, 12, 16, 24 or 32
surface.fill(color)
print('\nSurface 1 has bit depth', surface.get_bitsize(), ' | The color is: ', surface.get_at((0, 0)))

surface2 = pygame.surfarray.make_surface(pygame.surfarray.array2d(surface))
print('\nSurface 2 has bit depth', surface2.get_bitsize(), ' | The color is: ', surface2.get_at((0, 0)))
surface2.set_palette([(123, 123, 123) for _ in range(256)])  # Set whole color palette to one color
print('Surface 2 now has the color: ', surface2.get_at((0, 0)))

surface3 = pygame.surfarray.make_surface(pygame.surfarray.array3d(surface))
print('\nSurface 3 has bit depth', surface3.get_bitsize(), ' | The color is: ', surface3.get_at((0, 0)))
print('Surface 3 has no color palette since it has a bit depth greater than 8')