Mac*_*sik 13 python pygame transparent
是否可以显示具有可控alpha的PyGame表面?我想采用具有自己的每像素alpha的表面,并以不同的半透明度显示它,而不影响表面数据并保持透明度完好无损,即表面上的物体将保持其形状但其"内容"变得或多或少半透明.
换句话说,我想将来自源图像的每像素alpha与运行时计算的每表面alpha组合.
在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值发生变化,因此无法直接反转过程.
在检查了 PyGame 和 SDL 文档之后,我得出的结论是,我所要求的内容在使用标准函数的 PyGame 中是不可能实现的。
SDL 文档指出,每像素 alpha 和每表面 alpha 不能组合,前者始终优先。实现我想要的效果的唯一方法是编写一段代码,在位块传输之前更新源表面的每像素 alpha 值。