我有一个pygame Surface,想要反转颜色。有没有更快的方式和比这更pythonic?这很慢。
我知道从255减去这个值并不是“倒置颜色”的唯一定义,但这正是我现在想要的。
我很惊讶pygame没有这样内置的东西!
感谢您的帮助!
import pygame
def invertImg(img):
"""Inverts the colors of a pygame Screen"""
img.lock()
for x in range(img.get_width()):
for y in range(img.get_height()):
RGBA = img.get_at((x,y))
for i in range(3):
# Invert RGB, but not Alpha
RGBA[i] = 255 - RGBA[i]
img.set_at((x,y),RGBA)
img.unlock()
答案 0 :(得分:7)
取自:http://archives.seul.org/pygame/users/Sep-2008/msg00142.html
def inverted(img):
inv = pygame.Surface(img.get_rect().size, pygame.SRCALPHA)
inv.fill((255,255,255,255))
inv.blit(img, (0,0), None, BLEND_RGB_SUB)
return inv
这可能会导致alpha通道错误,但您应该可以通过其他调整来解决这个问题。
答案 1 :(得分:6)
温斯顿的答案很好,但为了完整起见,当必须在Python中逐个像素地操纵图像时,无论使用哪个图像库,都应该避免遍历每个像素。由于语言的性质,这是CPU密集型的,很少能够实时工作。
幸运的是,优秀的 NumPy 库可以帮助在字节流中执行多个标量操作,循环遍历本机代码中的每个数字,这比仅在Python中执行它快几个数量级。对于此特定操作,如果我们对xor
使用(2^32 - 1)
操作,我们可以将操作委托给本机代码中的内部循环。
此示例可以直接粘贴到Python控制台,将像素立即翻转为白色(如果已安装NumPy):
import pygame
srf = pygame.display.set_mode((640,480))
pixels = pygame.surfarray.pixels2d(srf)
pixels ^= 2 ** 32 - 1
del pixels
pygame.display.flip()
如果没有安装NumPy,pygame.surfarray
方法会返回普通的Python数组(来自stdlib
数组模块),你必须找到另一种操作这些数字的方法,因为普通的Python数组不能运行当给出诸如pixels ^= 2 ** 32 - 1
之类的行时所有元素。
答案 2 :(得分:1)
可能更有效的一种方法是使用PIL,如下所述:How to invert colors of image with PIL (Python-Imaging)?
很容易将其转换为内存中的本机pygame图像,如下所述:http://mail.python.org/pipermail/image-sig/2005-May/003315.html