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().调整透明度的任何其他想法(我们通过图像看多少)?
当您阅读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)
现在,我希望它快速