具有透明度的 mayavi 屏幕截图

Screenshot in mayavi with transparency

我正在尝试保存具有mayavi 场景透明度的屏幕截图。基于this discussion我写了一个脚本来保存图形,但是结果输出的很乱。下面是最小的工作示例:在 mayavi 中,我创建了一个包含两个球体的场景,并首先以 RGB 格式保存它,然后以 RGBA 格式保存。保存为 RGB 时工作,而 RGBA 文件是一团糟。我相信,问题出在 mayavi 方面,因为如果我从 mayavi 获取 RGB 图像,添加透明通道并使用 PIL 保存文件,结果就是我所期望的。

这是一个错误还是 mayavi rgba 格式应该以某种方式转换为 PIL 接受的格式?

from mayavi import mlab
from PIL import Image

fig=mlab.figure(1, bgcolor=(1, 1, 1), size=(700, 700))
# Set camera position and properties
fig.scene.parallel_projection = True
fig.scene.show_axes = True

# Draw atoms
x, y, z, t = [0.0,1.0] , [0.0,1.0], [0.0,0.0], [1,2]
dat = mlab.pipeline.scalar_scatter(x, y, z, t, figure=fig)
fig = mlab.pipeline.glyph(dat,scale_mode='none', scale_factor=0.5, figure=fig)

imgmap_RGB = mlab.screenshot(figure=fig, mode='rgb', antialiased=True)
img_RGB = Image.fromarray(imgmap_RGB, 'RGB')
img_RGB.save('foo_RGB.png')

imgmap_RGBA = mlab.screenshot(figure=fig, mode='rgba', antialiased=True)
img_RGBA = Image.fromarray(imgmap_RGBA, 'RGBA')
img_RGBA.save('foo_RGBA.png')

mlab.show()

出于某种我不知道的原因,mayavi 将 return 为 RGBA 数据在 0 和 1 之间浮动,为 RGB 数据为无符号整数,参见 https://github.com/enthought/mayavi/blob/master/mayavi/tools/figure.py#L304(我不能在文档中查找信息)。

要转换,请将 img_RGBA = ... 行替换为

img_RGBA = Image.fromarray(np.array(imgmap_RGBA*255, dtype=np.uint8))

之后我可以成功查看png文件了。