如何在pygame中反转图像颜色?

12 投票
3 回答
9055 浏览
提问于 2025-04-16 17:01

我有一个pygame的表面(Surface),想把颜色反转。有没有比这个更快、更符合Python风格的方法?这个方法有点慢。

我知道,把颜色值从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()

相关问题:

3 个回答

1

一种可能更有效的方法是使用PIL,具体内容可以参考这里:如何使用PIL反转图像颜色?

将它转换为原生的pygame图像在内存中是很简单的,具体步骤可以查看这里:http://mail.python.org/pipermail/image-sig/2005-May/003315.html

11

摘自: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通道)时会出错,不过你可以通过一些额外的调整来解决这个问题。

7

Winston的回答很好,但为了更全面地说明,当我们需要在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这样的行时,并不会对所有元素进行操作。

撰写回答