PyGame:每像素alpha的半透明精灵

Mac*_*sik 13 python pygame transparent

是否可以显示具有可控alpha的PyGame表面?我想采用具有自己的每像素alpha的表面,并以不同的半透明度显示它,而不影响表面数据并保持透明度完好无损,即表面上的物体将保持其形状但其"内容"变得或多或少半透明.

换句话说,我想将来自源图像的每像素alpha与运行时计算的每表面alpha组合.

tal*_*osh 7

pygame的文档说,你不能用逐点Alpha结合表面α,但如果你使用pygame的1.8.1或更高版本,您可以通过使用解决此special_flags参数.blit().

我是这样做的:

# Load an image with per-pixel alpha
s = pygame.image.load('spam.png')
s = s.convert_alpha()

# Simulate s.set_alpha(alpha)
alpha_img = pygame.Surface(s.get_rect().size, pygame.SRCALPHA)
alpha_img.fill((255, 255, 255, alpha))
s.blit(alpha_img, (0, 0), special_flags=pygame.BLEND_RGBA_MULT)
Run Code Online (Sandbox Code Playgroud)

这种方法的工作方式是创建与第一个相同大小的第二个表面,然后使用RGBA乘法将其blit到第一个表面.通过使第二图像的R,G和B分量等于255,乘法不会影响图像的颜色,但它将按给定的α因子缩放alpha通道.

请注意,上述方法与调用不同set_alpha(),set_alpha()可以通过调用来反转set_alpha(255).如果使用上述方法,则会导致每个像素的像素alpha值发生变化,因此无法直接反转过程.


Mac*_*sik 4

在检查了 PyGame 和 SDL 文档之后,我得出的结论是,我所要求的内容在使用标准函数的 PyGame 中是不可能实现的。

SDL 文档指出,每像素 alpha 和每表面 alpha 不能组合,前者始终优先。实现我想要的效果的唯一方法是编写一段代码,在位块传输之前更新源表面的每像素 alpha 值。