Python 在Pygame中,如何将透明图像无头保存到文件中?
以下是我最近提出的一个问题: 我能够保存涉及非透明表面对象的屏幕图像。但是,该技术不适用于透明曲面对象。以下代码说明了该问题:Python 在Pygame中,如何将透明图像无头保存到文件中?,python,png,pygame,Python,Png,Pygame,以下是我最近提出的一个问题: 我能够保存涉及非透明表面对象的屏幕图像。但是,该技术不适用于透明曲面对象。以下代码说明了该问题: import sys import os import pygame from pygame.color import THECOLORS as RGB class PygameProblemDemo(object): def __init__(self): screen_width, screen_height = 200, 2
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()
结果如下:
非字母图像.png
alpha_image.png
更新 如果我注释掉构造函数中的行
os.environ['SDL\u VIDEODRIVER']='dummy'
,则透明图像将成功保存:
alpha_image.png
但是,该行禁止窗口打开,因此脚本不能再无头运行:\ 我已经弄明白了。Pygame显示需要在启用alpha通道的情况下启动。要修复上面的示例,只需在构造函数中替换此行:
self.screen = pygame.display.set_mode((screen_width, screen_height))
为此:
self.screen = pygame.display.set_mode((screen_width, screen_height), 0, 32)
有没有可能比pygame更好地解决问题?