Python PIL - скругленный многоугольник - PullRequest
0 голосов
/ 26 апреля 2020

Можно ли динамически нарисовать многоугольник 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()

Вывод:

Output

Желаемый (создан в Lucid Chart):

enter image description here

1 Ответ

0 голосов
/ 26 апреля 2020

Вот мой лучший снимок. Растеризатор 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()

Image Result

...