【问题标题】:How to draw a transparent ellipse in Python with Pillow without outline如何在 Python 中使用没有轮廓的 Pillow 绘制透明椭圆
【发布时间】:2020-04-10 02:13:58
【问题描述】:

我正在尝试用 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

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

【问题讨论】:

    标签: python drawing python-imaging-library transparency


    【解决方案1】:

    在玩弄了一些代码,查看了文档和一些源代码之后,我很确定,arcchordellipse 等函数很可能存在一些问题,所有共享引擎盖下的相同代码。

    我创建了以下示例:

    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另一个编辑:已修复。

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

    【讨论】:

    • 非常感谢您进一步调查此问题,以获得全面的答案,并在 Github 上发布问题!这让我发疯了。我认为可能存在错误,但我认为更有可能是我误解了某些东西。它不能解决我的问题,但这是我能要求的最好的了。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多