我在Pygame中有一个精灵是一个蓝色圆圈。我想要将这个图像绘制到屏幕上“褪色”,例如半透明。但是,我不希望在它上面绘制半透明的矩形;相反,我希望修改实际图像并使其变得半透明。非常感谢任何帮助!
现在我有:
Class Circle(pygame.sprite.Sprite):
self.image = self.image = pygame.image.load("circle.png")
circle = Circle()
最终......
window.blit(pygame.transform.scale(circle.image, (zoom, zoom)), (100, 100))
circle.png看起来如何:
我希望图片在透明后看起来如何:
我将图像blitting到窗口上,这是一个白色背景。
答案 0 :(得分:3)
首先,您的图像/表面需要使用每像素alpha,因此在加载时调用convert_alpha()
方法。如果您想创建新曲面(如示例所示),您也可以将pygame.SRCALPHA
传递给pygame.Surface
。
第二步是创建另一个表面(此处称为alpha_surface
),用白色填充所需的alpha值(颜色元组的第四个元素)。
最后,您必须将alpha_surface
blit到您的图片上并将pygame.BLEND_RGBA_MULT
作为special_flags
参数传递。这将使
图像的不透明部分半透明。
import pygame as pg
pg.init()
screen = pg.display.set_mode((800, 600))
clock = pg.time.Clock()
BLUE = pg.Color('dodgerblue2')
BLACK = pg.Color('black')
# Load your image and use the convert_alpha method to use
# per-pixel alpha.
# IMAGE = pygame.image.load('circle.png').convert_alpha()
# A surface with per-pixel alpha for demonstration purposes.
IMAGE = pg.Surface((300, 300), pg.SRCALPHA)
pg.draw.circle(IMAGE, BLACK, (150, 150), 150)
pg.draw.circle(IMAGE, BLUE, (150, 150), 130)
alpha_surface = pg.Surface(IMAGE.get_size(), pg.SRCALPHA)
# Fill the surface with white and use the desired alpha value
# here (the fourth element).
alpha_surface.fill((255, 255, 255, 90))
# Now blit the transparent surface onto your image and pass
# BLEND_RGBA_MULT as the special_flags argument.
IMAGE.blit(alpha_surface, (0, 0), special_flags=pg.BLEND_RGBA_MULT)
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
screen.fill((50, 50, 50))
pg.draw.rect(screen, (250, 120, 0), (100, 300, 200, 100))
screen.blit(IMAGE, (150, 150))
pg.display.flip()
clock.tick(60)
pg.quit()
答案 1 :(得分:0)
使用每像素alpha创建一个新Surface。
surf = pygame.Surface((circle_width, circle_height), pygame.SRCALPHA)
使表面透明
surf.set_alpha(128) # alpha value
在(x=0, y=0)
surf.blit(pygame.transform.scale(circle.image, (zoom, zoom)), (0, 0))
将表面绘制到窗口
window.blit(surf, (circle_x, circle_y))
答案 2 :(得分:0)
正如Surface.set_alpha()
文档所说,你可以让表面具有“同质alpha”或每像素alpha,但不能同时使用两者,我认为这是你想要的。它可能适用于colorkey透明度,但我不确定(我还没有测试过)。如果您在blitting之前使用set_colorkey()
和set_alpha()
,则任何非RGBA(没有活动Alpha通道)像素格式都可能有效。
因此,代码可能如下所示:
class Circle(pygame.sprite.Sprite):
def __init__(self)
self.image = pygame.image.load("circle.png")
# get the surface's top-left pixel color and use it as colorkey
colorkey = self.image.get_at((0, 0))
self.image.set_colorkey(colorkey)
在代码中的某个时刻(在渲染之前),您可能希望通过调用:
来设置透明度circle.image.set_alpha(some_int_val)
然后你可以按照预期进行缩放和blit。