【问题标题】:Drawing semi-transparent polygons in PIL在 PIL 中绘制半透​​明多边形
【发布时间】:2010-06-25 17:16:25
【问题描述】:

如何使用Python Imaging Library 绘制半透明多边形?

【问题讨论】:

    标签: python image-processing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为@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 通道,不会使背景透明。但是,这种方法同样需要两个大小相同的图像。

        【讨论】:

        • 你有相同的代码示例吗?
        猜你喜欢
        • 2014-06-12
        • 2013-08-19
        • 2017-09-22
        • 1970-01-01
        • 2021-04-10
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多