如何在 Pygame 中将具有一定透明度的 PNG 传输到表面上?
- 2025-03-21 09:07:00
- admin 原创
- 52
问题描述:
我正在尝试将 PNG 图像传输到表面上,但是由于某种原因,图像的透明部分变黑,以下是简单的代码:
screen = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF, 32)
world = pygame.Surface((800, 600), pygame.SRCALPHA, 32)
treeImage = pygame.image.load("tree.png")
world.blit(treeImage, (0,0), (0,0,64,64))
screen.blit(world, pygame.rect.Rect(0,0, 800, 600))
我该怎么做才能解决这个问题?图像具有 alpha 透明度,我在 PhotoShop 中打开它,背景变为透明,而不是黑色、白色或任何其他颜色。
感谢您的支持:)
解决方案 1:
http://www.pygame.org/docs/ref/image.html建议:
对于 alpha 透明度,像 .png 图像一样
convert_alpha()
在加载后使用该方法,以便图像具有每个像素的透明度。
解决方案 2:
您没有翻转双缓冲区。
import pygame
from pygame.locals import Color
screen = pygame.display.set_mode((800, 600))
treeImage = pygame.image.load("tree.png").convert_alpha()
white = Color('white')
while(True):
screen.fill(white)
screen.blit(treeImage, pygame.rect.Rect(0,0, 128, 128))
pygame.display.flip()
这应该可以解决你的问题。
解决方案 3:
图像由“pygame.Surface”对象表示。可以使用以下方法从图像创建Surfacepygame.image.load
:
my_image_surface = pygame.load.image('my_image.jpg')
但是,pygame 文档指出:
返回的 Surface 将包含与其来源文件相同的颜色格式、colorkey 和 alpha 透明度。您经常希望
convert()
不带参数调用,以创建一个可以在屏幕上更快速绘制的副本。对于 alpha 透明度(如 .png 图像),请在加载后使用该
convert_alpha()
方法,以便图像具有每个像素的透明度。
使用该convert_alpha()
方法可获得最佳性能:
alpha_image_surface = pygame.load.image('my_icon.png').convert_alpha()
使用该方法,可以在一个Surface上绘制或与另一个Surfaceblit
混合。blit 的第一个参数是要绘制的Surface 。第二个参数是一个元组 ( x , y ),表示左上角或一个矩形。对于矩形,只考虑矩形的左上角。应该提到的是,窗口分别显示也由Surface表示。因此,在窗口中绘制Surface与在Surface上绘制Surface相同:
window_surface.blit(image_surface, (x, y))
window_surface.blit(image_surface,
image_surface.get_rect(center = window_surface.get_rect().center))
最小示例: repl.it/@Rabbid76/PyGame-LoadTransparentImage
import pygame
pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()
pygameSurface = pygame.image.load('Porthole.png').convert_alpha()
background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (160, 160, 160), (192, 192, 192)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
pygame.draw.rect(background, color, rect)
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
window.blit(background, (0, 0))
window.blit(pygameSurface, pygameSurface.get_rect(center = window.get_rect().center))
pygame.display.flip()
pygame.quit()
exit()
解决方案 4:
您的代码看起来应该是正确的。SDL 库不支持这样的 alpha 到 alpha 块传送,但 Pygame 不久前添加了对它的支持。在 Pygame 1.8 中增加了对自定义混合模式的支持,我想知道这是否会删除 Pygame 的内部 alpha 到 alpha 块传送?
唉,还需要进一步调查。
扫码咨询,免费领取项目管理大礼包!