PyGame导入带alpha通道(透明度)的图片时遇到的小问题
2022/4/8
在写玩具的时候想导有区域透明度的图片进pygame里,网上搜寻答案,看上去有效的和隔空对线的都没能解决问题。两个小时交代在这里了。想着也许以后能用上就花一点时间记录一下。
问题描述
带透明区域的png图片导入pygame里之后透明部分始终被白色部分填充如下:
而我实际希望达到的效果如下:
测试用窗口的主循环代码
# 窗口的主循环代码
while win32api.GetKeyState(0x1b) >= 0: # 显示循环--esc退出
clock.tick(60) # 帧率控制
for event in win.event.get(): # 这个循环是pygame自身的事件侦听循环
if event.type == pygame.QUIT: # 这个if用来判断监听窗体右上角叉叉
pygame.quit()
sys.exit() # 如果不加会报错 pygame.error: video system not initialized
screen.fill(pygame.Color(0, 50, 50)) # 填充背景色
# screen.blit(ball, pos) # 同下
screen.blit(enemy, pos) # 绘制
# tmp.blit(screen, (0, 0)) # tmp来自于网上看到的另一种方法,但是没有解决问题
# tmp.blit(enemy, (-25, -25))
# screen.blit(tmp, pos)
render_text(str(int(clock.get_fps())), (255, 0, 0), (0, 0)) # 窗体左上角的实时帧率
win.display.update()
原因分析:
pygame 中导入带透明度的图片靠函数 convert_alpha() 实现,这个函数用到了alpha通道(最坑的点)…
解决方案:
给源图像添加一个alpha通道即可
但是,从ps绘制导出的png格式图片虽然是“透明的”,但是它没有“事实上的”alpha通道。从ps里新建一个带透明度的图形以png保存后再用ps打开png文件可以发现png文件并没有alpha通道。
个人解决方案
将图片存储为bpm格式,并且在另存为图片(而非导出)时确保最底层图层是一个空的透明图层,同时在通道中有一个由 右键-存储选区得到的alpha图层,并保持 形状图层、底层透明图层和alpha通道的可见性,另存为bpm格式(勾选alpha通道)。