python - set_alpha - En Pygame, ¿cómo puedo guardar una imagen transparente sin cabeza en un archivo?
pygame star (1)
Lo he descubierto. La visualización de Pygame debe iniciarse con el canal alfa habilitado. Para arreglar mi ejemplo anterior, simplemente reemplace esta línea en el constructor:
self.screen = pygame.display.set_mode((screen_width, screen_height))
Con este:
self.screen = pygame.display.set_mode((screen_width, screen_height), 0, 32)
Esto sigue a una pregunta que recientemente hice:
En Pygame, ¿cómo puedo guardar una imagen de pantalla en modo sin cabeza?
Puedo guardar imágenes de pantalla que involucran objetos de superficie no transparentes. Sin embargo, la técnica no funciona para objetos de superficie transparentes. El siguiente código ilustra el problema:
import sys
import os
import pygame
from pygame.color import THECOLORS as RGB
class PygameProblemDemo(object):
def __init__(self):
screen_width, screen_height = 200, 200
os.environ[''SDL_VIDEODRIVER''] = ''dummy''
pygame.init()
pygame.display.init()
self.screen = pygame.display.set_mode((screen_width, screen_height))
def save_non_alpha_image(self):
r = 50
color = RGB[''blue'']
img_path = ''/tmp/non_alpha_image.png''
background = pygame.Surface((200, 200), pygame.SRCALPHA, 32)
pygame.draw.rect(background, RGB[''lightgray''], (0, 0, 200, 200), 0)
self.screen.fill(RGB[''black''])
self.screen.blit(background, (0,0))
pygame.draw.circle(self.screen, color, (100,100), r, 0)
pygame.image.save(self.screen, img_path)
print "image saved to %s" % (img_path)
def save_alpha_image(self):
r = 50
color = RGB[''blue'']
img_path = ''/tmp/alpha_image.png''
background = pygame.Surface((200, 200), pygame.SRCALPHA, 32)
pygame.draw.rect(background, RGB[''lightgray''], (0, 0, 200, 200), 0)
transparent_circle = self.draw_transparent_circle(r, color, 50)
self.screen.fill(RGB[''black''])
self.screen.blit(background, (0,0))
self.screen.blit(transparent_circle, (50,50))
pygame.image.save(self.screen, img_path)
print "image saved to %s" % (img_path)
def draw_transparent_circle(self, radius, color, transparency=0):
"""transparency is value between 0 and 100, 0 is opaque,
100 invisible"""
width, height = radius*2, radius*2
# transparent base surface
flags = pygame.SRCALPHA
depth = 32
base = pygame.Surface((width, height), flags, depth)
# alpha surface
alpha = int(round(255 * (100-transparency) / 100.0))
alpha_surface = pygame.Surface((width, height))
alpha_surface.set_colorkey(RGB[''black''])
alpha_surface.set_alpha(alpha)
# draw circle (to alpha surface)
pygame.draw.circle(alpha_surface, color, (radius,radius), radius)
# draw alpha surface to base surface
base.blit(alpha_surface, (0,0))
return base
demo = PygameProblemDemo()
demo.save_non_alpha_image()
demo.save_alpha_image()
Aquí están los resultados:
non_alpha_image.png
alpha_image.png
Actualizar
Si hago un comentario sobre la línea os.environ[''SDL_VIDEODRIVER''] = ''dummy''
en el constructor, la imagen transparente se guarda con éxito:
alpha_image.png
Sin embargo, esa es la línea que evita que la ventana se abra, por lo que el script ya no puede ejecutarse sin cabeza. : /