【问题标题】:Python PIL - Rounded PolygonPython PIL - 圆角多边形
【发布时间】:2020-04-25 21:10:10
【问题描述】:

是否可以动态绘制带有圆角的 N 边多边形?我见过为矩形/正方形做的例子,但不是为其他多边形做的。我可以轻松绘制多边形,但我希望为每个角实现圆角效果。非常感谢任何帮助!

from PIL import Image, ImageDraw

#Triangle
inset = 40
W, H = (300,300)
# Create empty black canvas
im = Image.new('RGBA', (W, H), '#558353')

# Draw polygon
draw = ImageDraw.Draw(im)
draw.polygon([(W/2,inset), (W-inset, H-inset), (inset,H-inset)], fill = 'black')

im.show()

输出:

期望(在 Lucid Chart 中创建):

【问题讨论】:

标签: python python-imaging-library


【解决方案1】:

这是我最好的尝试。 ImageDraw 光栅化器不太擅长画宽线。我不得不捏造线宽(使用+2)让它看起来更好一点。

from PIL import Image, ImageDraw
import operator

def vadd(a, b):
    """ Vector addition. """
    return tuple(map(operator.add, a, b))

#Triangle
inset = 40
W, H = (300,300)
# Create empty black canvas
im = Image.new('RGBA', (W, H), '#558353')

# Draw polygon
draw = ImageDraw.Draw(im)

# Vertices of the polygon.
v = [
    (inset, H-inset),
    (W-inset, H-inset),
    (W/2, inset) ]


# Radius of rounded corner.
r = 10
d = 2*r

# Outline of the polygon.
[ draw.line((v[i], v[i+1]), fill='black', width=d+2) for i in range(len(v)-1) ]
draw.line((v[-1], v[0]), fill='black', width=d+2)

# Draw a circle centered on each vertex.
for corner in v:
    c = [vadd(corner, (-r, -r)), vadd(corner, (r, r))]
    draw.pieslice(c, 0, 360, 'black') 

# Now fill in the middle.
ImageDraw.floodfill(im, (W/2, H/2), (0, 0, 0))

im.show()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-01-15
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
相关资源
最近更新 更多