Хотя это не объясняет поведение метода .polygon
, я нашел обходной путь.
Объединив .polygon
с .point
.line
, вы получите желаемый результат. (См. Редактирование ниже, почему использовать .line
вместо .point
)
# 1 точка
Python 3.7.6 (v3.7.6:43364a7ae0, Dec 18 2019, 14:18:50)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from PIL import Image, ImageDraw
>>> import numpy as np
>>> img = Image.new('L', (5, 5), 0)
>>> ImageDraw.Draw(img).polygon([2, 2, 2, 2, 2, 2, 2, 2], outline=1, fill=1)
>>> ImageDraw.Draw(img).line([2, 2, 2, 2, 2, 2, 2, 2], fill=1)
>>> np.array(img)
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=uint8)
# 2 линия
>>> img = Image.new('L', (5, 5), 0)
>>> ImageDraw.Draw(img).polygon([1, 1, 2, 1, 2, 1, 1, 1], outline=1, fill=1)
>>> ImageDraw.Draw(img).line([1, 1, 2, 1, 2, 1, 1, 1], fill=1)
>>> np.array(img)
array([[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=uint8)
# 3 прямоугольник
>>> img = Image.new('L', (5, 5), 0)
>>> ImageDraw.Draw(img).polygon([1, 1, 2, 1, 2, 2, 1, 2], outline=1, fill=1)
>>> ImageDraw.Draw(img).line([1, 1, 2, 1, 2, 2, 1, 2], fill=1)
>>> np.array(img)
array([[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=uint8)
РЕДАКТИРОВАТЬ : чтобы это работало и для более длинных строк (см. Ниже), вместо .point
необходимо использовать .line
.
С .point
>>> img = Image.new('L', (5, 5), 0)
>>> ImageDraw.Draw(img).polygon([1, 1, 3, 1, 3, 1, 1, 1], outline=1, fill=1)
>>> ImageDraw.Draw(img).point([1, 1, 3, 1, 3, 1, 1, 1], fill=1)
>>> np.array(img)
array([[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=uint8)
С .line
>>> img = Image.new('L', (5, 5), 0)
>>> ImageDraw.Draw(img).polygon([1, 1, 3, 1, 3, 1, 1, 1], outline=1, fill=1)
>>> ImageDraw.Draw(img).line([1, 1, 3, 1, 3, 1, 1, 1], fill=1)
>>> np.array(img)
array([[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]], dtype=uint8)