【问题标题】:Python PIL: How To Draw Custom Filled PolygonsPython PIL:如何绘制自定义填充多边形
【发布时间】:2020-10-05 17:40:57
【问题描述】:

我想知道pillow 中是否有一种方法可以绘制自定义填充多边形,我知道我可以绘制矩形和圆形,自定义多边形呢。

具体来说,我想绘制如下图所示的内容:

我怎样才能做到这一点,任何想法。谢谢

【问题讨论】:

  • 您的意思是像polygon 函数? (顺便说一句,我是通过单击您的链接找到的。)
  • 我认为你必须零碎地做,AFAIK,ImageDraw.polygon() 只画直线。
  • 您可以将cairosvg 与 PIL/Pillow 一起使用,因此,如果您熟悉并熟悉 SVG,那么这可能是您的一个选择。
  • @Mark Setchell,就像你说的,多边形只做直线......我实际上从未听说过这个 cairosvg 包我会检查一下谢谢,我的第一个猜测是画一个矩形和然后使用圆形/pieslice 并掩盖圆形的某些区域,但还没有真正找到实际实现的方法
  • 这就是我上面所说的 "piecemeal" 的意思...识别矩形和圆形并一次将它们构建起来。

标签: python-3.x image-processing python-imaging-library


【解决方案1】:

我不以我的平面设计能力或对美学修补的耐心而闻名,但这应该会给你一个想法:

#!/usr/bin/env python3

from PIL import Image, ImageDraw

# Form basic purple image without alpha
w, h = 700, 250
im = Image.new('RGB', (w,h), color=(66,0,102))

# Form alpha channel independently
alpha = Image.new('L', (w,h), color=0)

# Get drawing context
draw   = ImageDraw.Draw(alpha)
radius = 50
hline  = h-radius
OPAQUE, TRANSPARENT = 255, 0
# Draw white where we want opaque
draw.rectangle((0,0,w,hline), fill=OPAQUE)
draw.ellipse((w//2-radius,hline-radius,w//2+radius,h), fill=OPAQUE) 

# Draw black where we want transparent
draw.ellipse(((w//3)-radius,-radius,(w//3)+radius,radius), fill=TRANSPARENT)
draw.ellipse(((2*w//3)-radius,-radius,(2*w//3)+radius,radius), fill=TRANSPARENT)

# DEBUG only - not necessary
alpha.save('alpha.png')

# Put our shiny new alpha channel into our purple background and save
im.putalpha(alpha)
im.save('result.png')

alpha 通道看起来像这样 - 我人为地添加了一个红色边框,以便您可以看到它的范围:

【讨论】:

  • 很高兴它对您有用。祝你的项目好运!
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 2015-01-12
  • 2013-05-25
  • 2011-04-21
  • 1970-01-01
  • 2013-06-21
  • 2011-11-29
相关资源
最近更新 更多