我正在使用游戏进行图像编辑(而不是显示)。(是的,我知道还有其他的选择,比如PIL/枕头,但玩偶游戏应该能做到这一点。)
我想要绘制和保存一个图像,我将根据公式单独设置每个像素的alpha值(我正在绘制一个复杂的RGBA配置文件)。看来pixels_alpha是正确的方法。但是当我改变pixels_alpha时,它就被忽略了,图像就会保持透明。这是我的密码。
import pygame as pg
import os
def init_transparent(img_width, img_height):
"""
Create a new surface with width and height, starting with transparent
background. This part works!
"""
os.environ['SDL_VIDEODRIVER'] = 'dummy'
pg.init()
pg.display.init()
# next command enables alpha
# see http://stackoverflow.com/questions/14948711/
pg.display.set_mode((img_width, img_height), 0, 32)
# pg.SRCALPHA is a flag that turns on per-pixel alpha.
return pg.Surface((img_width, img_height), pg.SRCALPHA)
def make_semitransparent_image():
surf = init_transparent(20, 20)
# alphas should be a direct reference to the alpha data in surf
alphas = pg.surfarray.pixels_alpha(surf)
# alphas is a uint8-dtype numpy array. Right now it's all zeros.
for i in range(20):
for j in range(20):
# Since pixels_alpha gave me a uint8 array, I infer that
# alpha=255 means opaque. (Right?)
alphas[i,j] = 200
pg.image.save(surf, '/home/steve/Desktop/test.png')
make_semitransparent_image()同样,它保存了一个图像,但是无论我将alphas设置为什么值,图像看起来都是完全透明的。我在这里做错什么了?(使用Python2.7,pyplay1.9.1发行版)(事先谢谢!)
发布于 2013-07-07 15:40:43
Pygame说,只要结果数组存在,pixels_array()就会锁定该曲面,并且锁定的曲面可能无法正确绘制。情况似乎是,它们也没有被正确保存。在调用image.save()之前,需要丢弃alphas对象。这可以通过在del alphas之前添加image.save()来实现。
(请注意,这更多地是一种解决办法,而不是一种适当的解决办法。添加del alphas只能对CPython (而不是PyPy、Jython、IronPython)产生可靠的影响。也许你真的可以“关闭”一个超视距对象,就像你可以关闭一个文件或者仅仅忘记它一样?)
https://stackoverflow.com/questions/17506098
复制相似问题