在我的 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/