PyGame:使用alpha对图像应用透明度?

时间:2012-10-14 04:10:44

标签: python pygame alpha geometry-surface blit

我希望以指定的透明度显示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)

那么......怎么做的?

4 个答案:

答案 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件事后它确实有用:

  1. 图片 - >模式 - >转换为颜色配置文件...并使用默认值
  2. 图片 - >模式 - >索引...并使用默认值
  3. 保存更改后,它在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()