如何在不带轮廓的枕头中用Python绘制透明椭圆

我正在尝试使用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)],125))
drw.polygon([(50,0)],125))
drw.ellipse([(40,40),(w - 10,h - 10)],fill=(0,125),outline=None)
img.save('out.png','PNG')

(来自here,进行了一些修改)

Output

只有椭圆才有轮廓。为什么?如何避免这种情况?

dhtz_123 回答:如何在不带轮廓的枕头中用Python绘制透明椭圆

在研究了一些代码,看了文档和一些源代码之后,我很确定,最有可能arcchord,{{3 }},它们全部在后台共享相同的代码。

我创建了以下示例:

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,outline_alpha)
    if width is None:
        width = 0
    img = Image.new('RGB',(100,100),(255,255))
    drw = ImageDraw.Draw(img,'RGBA')
    drw.line([(0,40),40)],(0,255))
    drw.line([(50,0)],255))
    drw.polygon([(50,0),128),outline)
    drw.ellipse([(40,(90,90)],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,2),plt.imshow(example(255)),plt.title('Opaque outlines specified,3),plt.imshow(example(128)),plt.title('Semi-transparent outlines specified,4),plt.imshow(example(None,5)),width = 5')
plt.subplot(2,5),plt.imshow(example(255,6),plt.imshow(example(20,width = 5')
plt.tight_layout()
plt.show()

输出如下:

ellipse

查看多边形,如果未指定轮廓(左上图),我们将看到黑线可见,这是多边形的边界之一。指定不透明轮廓(顶部中央图像)后,黑线将不再可见。设置一个半透明的轮廓(右上图)显示该轮廓与多边形的边界相同。

现在,对于椭圆是相同的:如果未设置轮廓(左上),则仍显示轮廓,该轮廓很可能与fill参数使用相同的颜色,但未包含alpha值。设置不透明轮廓(位于顶部中心)会“覆盖”意外存在的轮廓,但是当设置半透明轮廓时,我们看到意外轮廓仍然存在。

width > 1中设置ellipse时,这种效果变得更加明显,请参阅最下面一行。意外的轮廓似乎仍然具有width = 1,而显式设置的轮廓具有width = 5

再次,我非常确定,这种行为不是故意的–我将在其GitHub问题跟踪器中打开一个问题。 编辑:我刚刚打开Output

希望有所帮助–某种方式...

本文链接:https://www.f2er.com/2905577.html

大家都在问