如何在 Python 中使用 Pillow 绘制一个没有轮廓的透明椭圆

How to draw a transparent ellipse in Python with Pillow without outline

我想用 Pillow 画多个透明椭圆,我想画出没有轮廓的椭圆。没有轮廓我好像做不出来。

这是一些测试代码:

from PIL import Image, ImageDraw
w,h = 100,100
img = Image.new('RGB', (w,h),(255,255,255))
drw = ImageDraw.Draw(img,"RGBA")
drw.polygon([(50, 0), (100, 100), (0, 100)], (255, 0, 0, 125))
drw.polygon([(50,100), (100, 0), (0, 0)], (0, 255, 0, 125))
drw.ellipse([(40, 40), (w - 10, h - 10)], fill=(0,0,255,125), outline=None)
img.save('out.png', 'PNG')

(来自 here,有一些修改)

Output

只有椭圆有轮廓。为什么?我怎样才能避免这种情况?

在尝试了一些代码、查看了文档和一些源代码之后,我很确定,像 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价值。设置不透明轮廓(顶部居中)"overwrites" 意想不到的轮廓已经存在,但是当设置半透明轮廓时,我们看到意想不到的轮廓仍然存在。

这个效果更加明显,在ellipse中设置width > 1时,见底行。意外的大纲似乎仍然有 width = 1,而显式设置的大纲有 width = 5.

同样,我很确定这种行为不是故意的——我将在他们的 GitHub 问题跟踪器中打开一个问题。 编辑: 我刚打开 this issue另一项编辑:已修复。

希望有所帮助——不知何故...