pygame裁剪透明图片后透明区域变黑,如何仅移除该黑色不影响原有黑色?
Pygame裁剪带alpha通道图片出现黑色透明区域的解决方案
问题原因:你创建的裁剪用Surface默认初始填充了不透明黑色,且未提前清空为全透明状态,blit原图后未被覆盖的区域就会残留初始黑色,这就是透明区域显示异常的原因。使用set_colorkey设置黑色为透明色会同时匹配原图本身的纯黑色像素,自然会出现误伤。
方案1:提前将新建Surface填充为全透明
适合裁剪区域超出原图边界、需要保留额外透明空白区域的场景,只需要在blit前加一行填充全透明的代码即可:
img = pygame.image.load(image_url).convert_alpha() cropped_img = pygame.Surface((100, 100)).convert_alpha() # 填充为全透明(RGBA第四个值为alpha通道,0表示完全透明) cropped_img.fill((0, 0, 0, 0)) cropped_img.blit(img, (0, 0))
这种方案不会修改原图任何像素,自然也不会影响原图本身的黑色显示。
方案2:使用subsurface直接裁剪原图
如果你的裁剪区域完全在原图的尺寸范围内,更推荐用subsurface方法直接截取子图像,不需要新建Surface再blit,性能更高且天然保留原alpha通道信息,不会出现黑块问题:
img = pygame.image.load(image_url).convert_alpha() # 从原图左上角(0,0)位置截取100x100大小的子图像,加copy()避免修改子图像时影响原图 cropped_img = img.subsurface(pygame.Rect(0, 0, 100, 100)).copy()
内容的提问来源于stack exchange,提问作者VanquishingSquid
相关产品推荐
相关产品推荐

