当您阅读 set_alpha 的文档时,您可以阅读以下内容:
如果 Surface 格式包含每个像素的 alpha,则此 alpha 值将被忽略。
%在您的情况下,使用 png 图像,它是每像素 alpha。因此,您必须管理“每个像素”的 alpha。例如,您可以这样做(不是最好的代码,但易于理解。仅使用没有/是透明度的 png):
def change_alpha(img,alpha=255):
width,height=img.get_size()
for x in range(0,width):
for y in range(0,height):
r,g,b,old_alpha=img.get_at((x,y))
if old_alpha>0:
img.set_at((x,y),(r,g,b,alpha))
小心,它“慢”,因为您管理每个不为 0 的像素(从您的 png 透明)。
如果您的 png 具有多级透明度,则应使用更好的公式管理透明度,如下所示:
r,g,b,old_alpha=img.get_at((x,y))
img.set_at((x,y),(r,g,b,(alpha*old_alpha)/255))
在这种情况下,永远不要修改原始图像,而是在副本上工作以永远不会丢失原始 alpha。
希望对你有帮助
======================编辑===================
添加一些优化,因为在评论中询问
使用一些缓存方法:
class image_with_alpha(object):
def __init__(self,name=None):
self.img=None
self.alpha={}
if name:
self.load_image(name)
def load_image(self,name):
self.img=pygame.image.load(name)
self.alpha[255]=self.img
#self.pre_compute_alpha()
def pre_compute_alpha(self):
for alpha in range(0,10):
self.alpha[alpha]=change_alpha(self.img,alpha)
def get_img(self,a=255):
try:
return self.alpha[a]
except:
self.alpha[a]=change_alpha(self.img,a)
return self.alpha[a]
并像这样使用它:
加载图片:
image=image_with_alpha("test.png")
使用 60 表示 alpha:
screen.blit(image.get_img(60),(0,0))
现在,我希望它很快