如何将 pygame 中的表面对象转换为 RGB 值的二维数组(每个像素一个值)?我已阅读有关 PixelArrays 和 Surfarrays 的文档,但似乎找不到我的问题的答案。例子非常受欢迎。
2 回答
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()
方法来映射颜色。Surface
PixelArray
这意味着您需要使用该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)):
...
希望这可以帮助。
将 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) 个可能值创建查找表,并根据表检查每个像素。虽然可以做到这一点,但这里提供的代码似乎更有效。