在PIL中绘制半透​​明多边形

时间:2010-06-25 17:16:25

标签: python image-processing

如何使用Python Imaging Library

绘制半透明多边形

3 个答案:

答案 0 :(得分:17)

您可以在单独的RGBA图像上绘制多边形,然后使用 Image.paste(图像,方框,蒙版)方法吗?

修改:这有效。

from PIL import Image
from PIL import ImageDraw
back = Image.new('RGBA', (512,512), (255,0,0,0))
poly = Image.new('RGBA', (512,512))
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([(128,128),(384,384),(128,384),(384,128)],
              fill=(255,255,255,127),outline=(255,255,255,255))
back.paste(poly,mask=poly)
back.show()

http://effbot.org/imagingbook/image.htm#image-paste-method

答案 1 :(得分:4)

我认为@Nick T的答案很好,但是在使用非常大的背景图像编写代码时需要小心,特别是在您可能在所述图像上注释多个多边形的情况下。这是我在处理带有一些物体检测代码的巨大卫星图像并使用透明矩形注释检测时所做的事情。为了使代码有效,无论背景图像的大小如何,我都提出以下建议。

我会修改解决方案,指定要粘贴的多边形图像只能保持多边形所需的大小,而不是与背面图像大小相同。多边形的坐标是相对于局部边界框而不是全局图像坐标指定的。然后将多边形图像粘贴到较大背景图像中的偏移处。

import Image
import ImageDraw
img_size = (512,512)
poly_size = (256,256)
poly_offset = (128,128) #location in larger image
back = Image.new('RGBA', img_size, (255,0,0,0) )
poly = Image.new('RGBA', poly_size )
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([ (0,0), (256,256), (0,256), (256,0)], 
              fill=(255,255,255,127), outline=(255,255,255,255))
back.paste(poly, poly_offset, mask=poly)
back.show()

答案 2 :(得分:2)

使用 Image.paste(图像,方框,蒙版)方法将背景图像粘贴区域中的Alpha通道转换为多边形图像的相应透明度值。

Image.alpha_composite(im1,im2)方法使用"粘贴"的alpha通道。图像,并不会使背景透明。但是,这种方法再次需要两个大小相同的图像。

相关问题