在玩弄了一些代码,查看了文档和一些源代码之后,我很确定,arc、chord、ellipse 等函数很可能存在一些问题,所有共享引擎盖下的相同代码。
我创建了以下示例:
from matplotlib import pyplot as plt
from PIL import Image, ImageDraw
def example(outline_alpha=None, width=None):
if outline_alpha is None:
outline = None
else:
outline = (255, 255, 0, outline_alpha)
if width is None:
width = 0
img = Image.new('RGB', (100, 100), (255, 255, 255))
drw = ImageDraw.Draw(img, 'RGBA')
drw.line([(0, 40), (100, 40)], (0, 0, 0, 255))
drw.line([(50, 100), (100, 0)], (0, 0, 0, 255))
drw.polygon([(50, 100), (100, 0), (0, 0)], (0, 255, 0, 128), outline)
drw.ellipse([(40, 40), (90, 90)], (0, 0, 255, 128), outline, width)
return img
plt.figure(1, figsize=(15, 10))
plt.subplot(2, 3, 1), plt.imshow(example()), plt.title('No outlines specified, width = 0')
plt.subplot(2, 3, 2), plt.imshow(example(255)), plt.title('Opaque outlines specified, width = 0')
plt.subplot(2, 3, 3), plt.imshow(example(128)), plt.title('Semi-transparent outlines specified, width = 0')
plt.subplot(2, 3, 4), plt.imshow(example(None, 5)), plt.title('No outlines specified, width = 5')
plt.subplot(2, 3, 5), plt.imshow(example(255, 5)), plt.title('Opaque outlines specified, width = 5')
plt.subplot(2, 3, 6), plt.imshow(example(20, 5)), plt.title('Semi-transparent outlines specified, width = 5')
plt.tight_layout()
plt.show()
输出如下:
查看多边形,如果没有指定轮廓(左上图),我们看到黑线是可见的,它是多边形的边界之一。指定不透明的轮廓(顶部中心图像),黑线不再可见。设置半透明轮廓(右上图)显示,轮廓与多边形的边界相同。
现在,椭圆也是如此:如果没有设置轮廓(左上角),仍然会显示轮廓,很可能与 fill 参数使用的颜色相同,但不包含 alpha 值。设置不透明轮廓(顶部中心)会“覆盖”意外存在的轮廓,但在设置半透明轮廓时,我们会看到意外轮廓仍然存在。
这个效果就更加明显了,在ellipse中设置width > 1的时候,看最下面一行。意外的轮廓似乎仍然有width = 1,而明确设置的轮廓有width = 5。
再次,我很确定,这种行为不是故意的——我将在他们的 GitHub 问题跟踪器中打开一个问题。 编辑:我刚刚打开了this issue。 另一个编辑:已修复。
希望能有所帮助——不知何故...