如何动态地在pygame中制作半透明图像

时间:2014-02-09 23:09:06

标签: python image pygame transparency blit

我正在使用pygame中的自定义gui组件,在制作滑块组件时,我给滑块一个Draw(parentSurface)函数,该滑块将滑块绘制到其存储位置的父曲面上。

现在这样可行,但滑块存储两个图像:

  • 从瓷砖动态制作的幻灯片图像,以匹配滑块的给定长度,以给定长度的宽度进行测量,高度为3像素;和
  • “选择”图像,它只是一个小的8x12指示器,用于显示滑块的位置。

问题是当我Draw(parentSurface)时,我这样做:

def Draw(self, parsurf):
    '''draw the element on parsurf at the given location'''
    w1 = self.slider_img.get_width()
    h1 = self.slider_img.get_height()
    w2 = self.select_img.get_width()
    h2 = self.select_img.get_height()
    self.image = pygame.Surface((w1, h2 + h1))
    self.image = ColorMod.Transparency(self.image, 0)
    self.image.blit(self.slider_img, (0, self.image.get_height()-h1))
    x = self.value / self.conversionratio
    self.image.blit(self.select_img, (x- w2/2, 0))
    if self.debug_on:
        print "attempting to blit to the given surface"
    parsurf.blit(self.image, self.loc)

然而,它在self.image上以黑色背景闪烁。我希望它是半透明的,以便背景可以显示self.image上没有任何内容。我应该放弃self.image并将self.slider_imgself.select_img直接绘制到父表面吗?

2 个答案:

答案 0 :(得分:0)

您必须通过调用self.image.set_alpha((0,0,0))使图片透明。同样在self.image = pyame.Surface中,您需要将其更改为self.image = pygame.Surface((width, height), pygame.SRCALPHA) 我还建议摆脱self.image = ColorMod.Transparency...

答案 1 :(得分:0)

如果动态创建Surface名称所引用的self.slider_img对象,则在首次创建Surface实例时,应调用Surface.convert_alpha以获取{{1}为每像素alpha值提供适当的像素格式。然后,您应该能够根据需要逐个像素地设置alpha。

http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert_alpha