Pygame,使用convert_alpha()导入的图像上设置透明度

n0t*_*tis 6 python png transparency pygame image

在我的pygame游戏中,要导入jpeg图像,我使用convert() http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert

然后,为了使用图像透明度(我们可以通过图像看到多少),我使用set_alpha() http://www.pygame.org/docs/ref/surface.html#pygame.Surface.set_alpha

但是,为了导入我的png图像,它有一个透明的背景,我使用convert_alpha() http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert_alpha

但是通过这种导入方式,我无法使用一般的透明度set_alpha().调整透明度的任何其他想法(我们通过图像看多少)?

A.H*_*A.H 6

当您阅读set_alpha的文档时,您可以阅读: 如果Surface格式包含每像素alphas,则将忽略此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))
Run Code Online (Sandbox Code Playgroud)

要小心,它"慢",因为你管理的每个像素都不是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))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,永远不要修改原始图像,但在副本上工作永远不会丢失原始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]
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:加载图像:

    image=image_with_alpha("test.png")
Run Code Online (Sandbox Code Playgroud)

Blit with 60 for alpha:

    screen.blit(image.get_img(60),(0,0))
Run Code Online (Sandbox Code Playgroud)

现在,我希望它快速