1

从下面的示例中可以看出,如果多边形是线或点,则不会绘制它。我不认为这是期望的行为。理论上一条线也是一个多边形对吧?

来自PIL 的文档

ImageDraw.polygon(xy,填充=无,轮廓=无)

绘制一个多边形。

多边形轮廓由给定坐标之间的直线以及最后一个坐标和第一个坐标之间的直线组成。

...

对我来说,这表明该.polygon方法通过在点之间画线来工作,但是,如示例 #2 所示,它绝对不是。

谁能告诉我为什么会这样?有人还可以告诉我如何做到这一点,即使多边形是一条线或点,它仍然被绘制?

#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)
>>> np.array(img)
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 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)
>>> np.array(img)
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]], dtype=uint8)

#3 Squire 作为多边形:

>>> img = Image.new('L', (5, 5), 0)
>>> ImageDraw.Draw(img).polygon([1, 1, 2, 1, 2, 2, 1, 2], outline=1, 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)

编辑:我搜索了一下多边形的定义;

在几何学中,多边形可以定义为具有直边的平面或平面的二维封闭形状。

资源

具有至少三个直边和直角的平面图形,通常为五个或更多。

资源

于是出现了一个新问题;0度角也算几何中的角吗?根据这个来源,它是:

零角度

测量为零度的角称为零角。如果这很难可视化,请考虑形成大于零度角的两条射线,例如 . 然后想象其中一条射线朝着另一条射线旋转,直到它们都位于同一条线上。他们创造的角度已经从原来的尺寸缩小到零度。现在形成的角度的测量值为 0 度。

4

1 回答 1

1

虽然这并不能解释该.polygon方法的行为,但我找到了一种解决方法。

通过.polygon与您结合将获得所需的结果。(请参阅下面关于为什么使用over 的编辑).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)

编辑:为了使这也适用于更长的行(见下文).line,必须使用而不是.point.

.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)
于 2020-07-14T09:50:02.273 回答