在PIL中绘制半透明多边形

12 投票
3 回答
14656 浏览
提问于 2025-04-16 00:26

如何使用Python图像库绘制半透明的多边形?

3 个回答

3

使用 Image.paste(image, box, mask) 这个方法时,会把你粘贴的图像区域的透明度(也就是alpha通道)转换成背景图像中对应的透明值。

Image.alpha_composite(im1, im2) 这个方法则是利用了被“粘贴”图像的透明度,它不会让背景变得透明。不过,这个方法同样需要两张大小相同的图片。

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()
21

你能在一个单独的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

撰写回答