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

标签 python image pygame png transparency

在我的 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() 来玩一般透明度。任何其他调整透明度的想法(我们从图像中看到多少)?

最佳答案

当您阅读set_alpha 的文档时,您可以阅读以下内容: 如果 Surface 格式包含每像素 alpha,则此 alpha 值将被忽略。

%在您的例子中,对于 png 图像,它是每像素 alpha。因此,您必须“按像素”管理 alpha。例如,您可以这样做(不是最好的代码,但很容易理解。使用 png 仅具有 no/yes 透明度):

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")

alpha 为 60 的 Blit:

    screen.blit(image.get_img(60),(0,0))

现在,我希望它很快

关于python - Pygame,在使用 convert_alpha() 导入的图像上设置透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35332978/

相关文章:

android - 图像未使用 Html.fromhtml 在 TextView 中显示

python - 群体碰撞在 Pygame 的平台滚动条上不起作用

python - Numpy 错误 : underflow encountered in exp

python - 如何检查是否执行了 Python 中的 RE

Android Imagebutton 改变 Image OnClick

python - 如何旋转三角形pygame

python - 在 python3.5 osx 上安装 pygame

python - 如何使用 sqlalchemy 表达式语言/sqlalchemy 核心连接来自两个不同数据库的表?

python - 将对象树从文件读取到 Python 中

Android - 为什么我保存的图片没有出现在手机的默认图库中?