在PIL中绘制半透明多边形

12
3个回答

20

你能在单独的RGBA图像上绘制多边形,然后使用 Image.paste(image, box, mask) 方法吗?

编辑:这可行。

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


5

我认为@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()

3
使用Image.paste(image, box, mask)方法将转换背景图像中粘贴区域的alpha通道为多边形图像对应的透明度值。 Image.alpha_composite(im1,im2)方法利用“粘贴”的图像的alpha通道,但不会使背景透明。然而,此方法再次需要两个大小相等的图像。

你有相同的代码示例吗? - sandeepsign

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接