简体   繁体   English

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

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

I am trying to draw multiple transparent ellipses with Pillow, and I want to draw them without outlines.我想用 Pillow 绘制多个透明椭圆,我想绘制它们没有轮廓。 I can't seem to make it work without outlines.如果没有轮廓,我似乎无法让它工作。

Here is some test code:下面是一些测试代码:

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')

(from here , with some modifications) (从这里开始,有一些修改)

Output输出

Only the ellipse gets an outline.只有椭圆有轮廓。 Why?为什么? How can I avoid this?我怎样才能避免这种情况?

After playing around with some codes, looking at the documentation and some source codes, I'm quite sure, that most likely there's some issue with the functions like arc , chord , ellipse , that all share the same code under the hood.在尝试了一些代码、查看文档和一些源代码之后,我很确定,很可能存在一些问题,如arcchordellipse ,它们都在ellipse共享相同的代码。

I created the following example:我创建了以下示例:

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()

The output is the following:输出如下:

输出

Looking at the polygon, if no outline is specified (top left image), we see that the black line is visible, which is one of the polygon's borders.查看多边形,如果没有指定轮廓(左上图),我们会看到黑色线条可见,它是多边形的边界之一。 Specifying an opaque outline (top center image), the black line's no longer visible.指定不透明轮廓(顶部中心图像),黑线不再可见。 Setting a semi-transparent outline (top right image) reveals, that the outline is identical to the polygon's border.设置半透明轮廓(右上图)表明轮廓与多边形的边界相同。

Now, the same for the ellipse: If no outline is set (top left), an outline is shown nevertheless, most likely the same color as used for the fill parameter, but without incorporating an alpha value.现在,椭圆也一样:如果没有设置轮廓(左上角),仍然会显示轮廓,很可能与用于fill参数的颜色相同,但不包含 alpha 值。 Setting an opaque outline (top center) "overwrites" the unexpected existent outline, but when setting a semi-transparent outline, we see that the unexpected outline is still there.设置一个不透明的轮廓(顶部中心)会“覆盖”意外的存在轮廓,但是当设置一个半透明的轮廓时,我们看到意外的轮廓仍然存在。

This effect becomes even more obvious, when setting width > 1 in ellipse , see the bottom row.这种效果更加明显,当设置width > 1ellipse width > 1时,见底行。 The unexpected outline still seems to have width = 1 , whereas the explicitly set outline has width = 5 .意外的轮廓似乎仍然具有width = 1 ,而明确设置的轮廓具有width = 5

Again, I'm quite sure, that this behavior isn't intended – and I will open an issue in their GitHub issue tracker.同样,我很确定这种行为不是故意的 - 我将在他们的 GitHub 问题跟踪器中打开一个问题。 EDIT: I just opened this issue .编辑:我刚刚打开了这个问题 ANOTHER EDIT: It's fixed.另一个编辑:它已修复。

Hope that helps – somehow...希望有所帮助 - 不知何故......

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM