你如何用Python绘制透明多边形?

car*_*ier 20 alpha polygon python-imaging-library

我正在使用PIL(Python Imaging Library).我想绘制透明多边形.似乎指定包含alpha级别的填充颜色不起作用.他们的解决方法是什么?

如果使用PIL无法完成,我愿意使用别的东西.

如果存在多个解决方案,则应考虑性能.绘图需要尽可能快.

小智 49

这是Pillow,一个更加维护的PIL分支.http://pillow.readthedocs.org/

如果要绘制相对于彼此透明的多边形,则基本图像必须是RGB类型,而不是RGBA,并且ImageDraw必须是RGBA类型.例:

from PIL import Image, ImageDraw

img = Image.new('RGB', (100, 100))
drw = ImageDraw.Draw(img, 'RGBA')
drw.polygon([(50, 0), (100, 100), (0, 100)], (255, 0, 0, 125))
drw.polygon([(50,100), (100, 0), (0, 0)], (0, 255, 0, 125))
del drw

img.save('out.png', 'PNG')
Run Code Online (Sandbox Code Playgroud)

这将绘制两个三角形重叠的两种颜色混合.这比为每个多边形合成多个"图层"要快得多.

  • 谢谢,这个很有用。我不知道你从哪里得到这些信息——我没有看到它被记录在案。除了您提到的那些之外,在使用 RGB/RGBA 组合时,我遇到了一些奇怪的行为...... (3认同)

akd*_*dom 6

使用PIL绘制透明图像时我必须要做的是创建一个颜色图层,在其上绘制多边形的不透明图层,并将它们与基础图层合成,如下所示:

color_layer = Image.new('RGBA', base_layer.size, fill_rgb)
alpha_mask = Image.new('L', base_layer.size, 0)
alpha_mask_draw = ImageDraw.Draw(alpha_mask)
alpha_mask_draw.polygon(self.outline, fill=fill_alpha)
base_layer = Image.composite(color_layer, base_layer, alpha_mask)
Run Code Online (Sandbox Code Playgroud)

使用Image.Blend时,我在绘制的多边形上有奇怪的轮廓行为问题.

这种方法的唯一问题是在绘制大量合理大小的多边形时性能很差.一个更快的解决方案就是"手动"在图像的numpy数组表示上绘制多边形.


小智 2

我使用cairo + pycairo 来实现此目的,并且效果很好。如果有在 pil 中无法在 cairo 中完成的操作,您可以使用 python 缓冲区接口在 PIL 和 cairo 之间共享图像数据。