7

如何将 pygame 中的表面对象转换为 RGB 值的二维数组(每个像素一个值)?我已阅读有关 PixelArrays 和 Surfarrays 的文档,但似乎找不到我的问题的答案。例子非常受欢迎。

4

2 回答 2

9

pygame文档说,给定一个表面对象,您可以创建一个包装器,通过调用模块的方法PixelArray来提供对其像素的直接 2D 数组访问:PixelArray()

pxarray = pygame.PixelArray(surface)

从逻辑上讲PixelArray对象是存储为整数的 RGB 值的二维数组。

可以PixelArray为像素项分配原始整数值、 pygame.Color实例(用于颜色表示的对象)或(r, g, b[, a])元组。

pxarray[x, y] = 0xFF00FF
pxarray[x, y] = pygame.Color(255, 0, 255)
pxarray[x, y] = (255, 0, 255)

它还提到:

但是,只返回一个像素的整数值。因此,要将像素与特定颜色进行比较,首先需要使用为其创建对象的Surface.map_rgb() 方法来映射颜色。SurfacePixelArray

这意味着您需要使用该Surface.map_rgb()方法从PixelArray整数值中获取 RGB 元组,只要您没有对数组进行赋值,即读取像素值时,就像在以下条件中所做的那样:

# Check, if the first pixel at the topleft corner is blue
if pxarray[0, 0] == surface.map_rgb((0, 0, 255)):
    ...

希望这可以帮助。

于 2012-10-18T16:46:59.500 回答
1

将 Surface 包装在PixelArray中后,unmap_rgb函数可以将像素转换为pygame.Color对象。

例如:

import pygame
pygame.init()
image = pygame.image.load('example.png')
pixel = pygame.PixelArray(image)
center = int(image.get_width()/2), int(image.get_height()/2)
colour = image.unmap_rgb(pixel[center])
print(str(colour))

编辑:要将所有这些 pygame.Color 对象完全转换为 RGB 元组的二维数组,您可以使用以下代码:

import pygame
pygame.init()
image = pygame.image.load('example.png')
pixel = pygame.PixelArray(image)

color_array = [[image.unmap_rgb(pixel[x, y]) for x in range(0, image.get_width())] for y in range(0, image.get_height())]

rgb_array = [[(column.r, column.g, column.b) for column in row] for row in color_array]

print(str(rgb_array))

请注意,如果您要使用 map_rgb (如另一个答案中所建议的那样),您可能必须针对超过 1600 万个 map_rgb 调用测试每个像素(每个像素对应 256 * 256 * 256 个可能的 RGB 值)。如果您还想要 alpha 值,则将可能值再乘以 256。使用 map_rgb 的另一种策略可能是从 (256 ** n) 个可能值创建查找表,并根据表检查每个像素。虽然可以做到这一点,但这里提供的代码似乎更有效。

于 2021-03-12T05:04:18.257 回答