我希望以指定的透明度显示an image with alpha,但无法弄清楚如何操作。
要详细说明我是如何努力的,下面的模糊是来自this SO answer的稍微修改的代码块,但是如果你运行它,你会看到“图像”丢失它的原生alpha,而“image2”的alpha不会改变!呸。
#!/usr/bin/env python
import pygame, sys
pygame.init()
window = pygame.display.set_mode((200, 200))
background = pygame.Surface((window.get_size()))
background.fill((255, 255, 255))
image = image2 = pygame.image.load('alpha.png')
image = image.convert()
rect = image.get_rect()
image2 = image2.convert_alpha()
rect2 = image2.get_rect()
rect2.left = rect.width + 1
i = 0
while True:
for event in pygame.event.get():
if event.type == 12:
pygame.quit()
sys.exit()
image.set_alpha(i)
image2.set_alpha(i)
window.fill((255, 255, 255))
window.blit(background, background.get_rect())
window.blit(image, rect)
window.blit(image2, rect2)
if i == 255:
i = 0
else:
i += 1
pygame.display.update()
pygame.time.Clock().tick(60)
那么......怎么做的?
答案 0 :(得分:14)
制作要显示的图像的副本(不更改原件)并使用以下内容:
self.image = self.original_image.copy()
# this works on images with per pixel alpha too
alpha = 128
self.image.fill((255, 255, 255, alpha), None, pygame.BLEND_RGBA_MULT)
抱歉,不提供完整的示例。
答案 1 :(得分:4)
如果你只是想在pygame中加载一个图像,所以它有一个alpha通道,这是怎么做的:
self.image = pygame.image.load("image file path").convert_alpha()
当您在屏幕上绘制此图像时,它应包含透明度。
答案 2 :(得分:3)
对于它的价值,我看到了不同的结果,具体取决于图像本身。在我的情况下,我发现使用Gimp更改图像可以让我保持代码简单:
image = pygame.image.load('path/to/my.png').convert()
image.set_alpha(128)
surface.blit(image, (0, 0))
使用该代码,以下精灵只是不能正常工作: http://www.spriters-resource.com/resources/sheets/47/50365.png
但是,使用Gimp更改2件事后它确实有用:
保存更改后,它在Ubuntu中适用于我。我无法发布结果图片,因为我是新用户......
答案 3 :(得分:0)
你的代码有点复杂:-)但是,“非每像素” - 或者 表面上的“全局alpha”在Pygame中很难完成。
所有文件都记录在http://www.pygame.org/docs/ref/surface.htm - 但实际上,文字或例子都很简短。
如果您正在进行blitting的表面(源)具有像素本身的alpha像素值(即32位深度),则将忽略由surface的set_alpha方法设置的“全局alpha”值。
对于要使用的“全局”Alpha,源表面不得包含每像素alpha。如果你的原始图像(在你的情况下,“alpha.png”文件)本身不使用透明度,这很容易实现 - 只需要:
import pygame
pygame.init()
window = pygame.display.set_mode((200, 200))
image = pygame.image.load('alpha.png').convert(24)
image.set_alpha(128)
window.fill((255,255,255))
window.blit(image, (0,0))
pygame.display.flip()
但是,如果你的“alpha.png”确实使用了透明度,并且你打算保留它,那就变得更加棘手了!
您必须:创建另一个图像,图像大小相同,深度= 24 使用图像中使用的颜色而不是填充该表面(如“色度键”) - 在视频效果中,通常它们使用纯绿色或纯白色,但是你 可以选择任何RGB值 - 如果您的图像是照片而不是像素艺术, 你将无法知道女巫价值将不会被使用。只需挑选任何,希望 不要有太多“失败的像素”。 因此,使用此关键颜色填充曲面,并将其设置为曲面的关键颜色: 在进行blitting时,colro将呈现完全透明。 然后,只需在此中间曲面上显示原始图像,在其上设置全局alpha(set_alpha)并将blitit设置到目标曲面
在代码中,它大致翻译为:
import pygame
pygame.init()
window = pygame.display.set_mode((200, 200))
image = pygame.image.load('alpha.png')
surface = pygame.Surface(image.get_size(), depth=24)
key = (0,255,0)
surface.fill(surface.get_rect(), key)
surface.set_colorkey(key)
surface.blit(image, (0,0))
surface.set_alpha(128)
window.fill((255,255,255))
window.blit(surface, (0,0))
pygame.display.flip()