我正在尝试使用 Mayavi 场景的透明度保存屏幕截图。基于 this discussion 我写了一个脚本来保存图形,但结果是输出一团糟。下面是最小的工作示例:在 mayavi 中,我创建了一个包含两个球体的场景,并首先以 RGB 格式保存,然后以 RGBA 格式保存。保存为 RGB 有效,而 RGBA 文件一团糟。我相信,问题出在 mayavi 方面,因为如果我从 mayavi 获取 RGB 图像,添加透明 channel 并使用 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 将为 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文件。

关于python - mayavi 中的屏幕截图,具有透明度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42974425/

10-12 16:54