2024-05-28 20:21:11 发布
网友
是否可以用可控制的alpha显示PyGame曲面?我想取一个具有自己的每像素alpha的曲面,并在不影响曲面数据的情况下以可变的半透明级别显示它,并保持透明度不变,即曲面上的对象将保持其形状,但其“内容”或多或少变得半透明。
换言之,我希望将源图像中的每像素alpha与运行时计算的每曲面alpha合并。
在检查了PyGame和SDL文档之后,我得出结论,我所要求的在PyGame中使用标准函数是行不通的。
SDL文档指出,每像素alpha和每表面alpha不能与始终优先的前者组合。实现我想要的效果的唯一方法是编写一个代码,在blit之前更新源曲面的每像素alpha值。
是的,你可以。documentation of the Surface class解释了如何做。它可以归结为两种情况: 在创建曲面对象期间设置标志:
s = pygame.Surface((16, 16), flags=pygame.SRCALPHA)
或者给一个还没有alpha通道的曲面一个alpha通道:
s = pygame.image.load('spam.png') s.convert_alpha()
pygame.image模块的文档说明,对于具有透明度的PNG,应用convert_alpha是必要的。
如果需要,可以使用模块draw和surfarray修改每个像素的alpha值。指定颜色时,使用四个整数的元组:(红色、绿色、蓝色、alpha)。alpha参数的范围从0(完全透明)到255(完全不透明)。
import pygame pygame.init() screen = pygame.display.set_mode((320, 200)) screen.fill((200, 100, 200)) s = pygame.Surface((64, 64), flags=pygame.SRCALPHA) for i in range(64): pygame.draw.line(s, (0, 0, 0, i*4), (0, i), (64, i)) screen.blit(s, (50, 30)) pygame.display.flip()
Pygame documentation表示不能将surface alpha与per pixel alpha结合使用,但是如果使用的是Pygame 1.8.1或更新版本,则可以使用special_flags参数来解决此问题。
special_flags
我是这样做的:
# 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)
其工作方式是创建与第一个相同大小的第二个曲面,并使用RGBA multiplication将其blit到第一个曲面上。通过使第二图像的R、G和B分量等于255,乘法不会影响图像的颜色,但它将按给定的α因子缩放α通道。
注意,上面的方法不同于调用set_alpha(),因为set_alpha()可以通过调用set_alpha(255)来反转。如果使用上述方法,则会导致每个像素的像素字母发生更改,因此无法直接反转该过程。
set_alpha()
set_alpha(255)
在检查了PyGame和SDL文档之后,我得出结论,我所要求的在PyGame中使用标准函数是行不通的。
SDL文档指出,每像素alpha和每表面alpha不能与始终优先的前者组合。实现我想要的效果的唯一方法是编写一个代码,在blit之前更新源曲面的每像素alpha值。
是的,你可以。documentation of the Surface class解释了如何做。它可以归结为两种情况: 在创建曲面对象期间设置标志:
或者给一个还没有alpha通道的曲面一个alpha通道:
pygame.image模块的文档说明,对于具有透明度的PNG,应用convert_alpha是必要的。
如果需要,可以使用模块draw和surfarray修改每个像素的alpha值。指定颜色时,使用四个整数的元组:(红色、绿色、蓝色、alpha)。alpha参数的范围从0(完全透明)到255(完全不透明)。
Pygame documentation表示不能将surface alpha与per pixel alpha结合使用,但是如果使用的是Pygame 1.8.1或更新版本,则可以使用
special_flags
参数来解决此问题。我是这样做的:
其工作方式是创建与第一个相同大小的第二个曲面,并使用RGBA multiplication将其blit到第一个曲面上。通过使第二图像的R、G和B分量等于255,乘法不会影响图像的颜色,但它将按给定的α因子缩放α通道。
注意,上面的方法不同于调用
set_alpha()
,因为set_alpha()
可以通过调用set_alpha(255)
来反转。如果使用上述方法,则会导致每个像素的像素字母发生更改,因此无法直接反转该过程。相关问题 更多 >
编程相关推荐