Skip to content

Unexpected, additional outline in ImageDraw.ellipse, even for outline=None #4277

@HansHirse

Description

@HansHirse

What did you do?

Drawing a polygon using ImageDraw.polygon and an ellipse using ImageDraw.ellipse with no outline specified, with an opaque outline, and with a semi-transparent outline.

What did you expect to happen?

ImageDraw.polygon and ImageDraw.ellipse should behave the same for the mentioned cases.

What actually happened?

The output created by the code below:

Figure_1

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. 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. The unexpected outline still seems to have width = 1, whereas the explicitly set outline has width = 5.

What are your OS, Python and Pillow versions?

  • OS: Windows 10 Prof.
  • Python: 3.7.1
  • Pillow: 6.2.1
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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugAny unexpected behavior, until confirmed feature.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions