我不确定我是否完全理解了这个问题。据我所知,如果你初始化 pygame 和像这样的表面(注意每行中的“32”),pygame 表面是 RGBA(准确地说,BGRA)连续数组:
# display surface
DISP = pygame.display.set_mode((window_w, window_h), 0, 32)
# some surface
window = pygame.Surface((w, h), 0, 32)
此外,我建议尽可能使用 32 位,而不是 24 位,因为 24 位表面很难与数组互操作(我numpy
用于存储和操作图像数据)。
例如,如果我没记错的话,一个 24 位表面必须具有可被 4 整除的像素数量。
如前所述,我不确定您的最终任务是什么,但这就是我的做法。
例如,使用 lib 加载图像openCV
并将其转换为 BGRA 数组:
# BGR 3d numpy array array (shape = h, w, 3) with image data
img = cv2.imread(filename)
# BGRA 3d numpy array (shape = h, w, 4)
img = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
然后这个函数将整个数组数据复制到一个表面中,只需要确保它们具有相同的像素大小:
# copy array data into a pygame surface
def copy_arr(surface, myarray):
bv = surface.get_buffer()
bv.write(myarray.tostring(), 0)
但也可能是你想做其他事情。