Python PIL: Как нарисовать эллипс в середине изображения?

Кажется, у меня проблемы с получением этого кода:

import Image, ImageDraw

im = Image.open("1.jpg")

draw = ImageDraw.Draw(im)
draw.ellipse((60, 60, 40, 40), fill=128)
del draw 

im.save('output.png')
im.show()

Это должно нарисовать эллипс в точке (60,60), который составляет 40 на 40 пикселей. Изображение ничего не возвращает.

Этот код работает отлично:

draw.ellipse ((0,0,40,40), fill=128)

Кажется, что когда я меняю первые 2 координаты (для которых нужно разместить эллипс), это не сработает, если они больше размера эллипса, который нужно нарисовать. Например:

draw.ellipse ((5,5,15,15), fill=128)

Работает, но только показывает часть прямоугольника. В то время как

draw.ellipse ((5,5,3,3), fill=128)

ничего не показывает.

Это происходит при рисовании прямоугольника.

Ответ 1

Ограничивающий прямоугольник представляет собой 4-кортеж (x0, y0, x1, y1), где (x0, y0) - верхняя левая граница поля, а (x1, y1) - нижняя граница поля.

Чтобы нарисовать эллипс в центре изображения, вам нужно определить, насколько вы хотите, чтобы ограничивающий прямоугольник эллипса (переменные eX и eY в моем фрагменте кода ниже).

С учетом сказанного ниже приведен фрагмент кода, который рисует эллипс в центр изображения:

from PIL import Image, ImageDraw

im = Image.open("1.jpg")

x, y =  im.size
eX, eY = 30, 60 #Size of Bounding Box for ellipse

bbox =  (x/2 - eX/2, y/2 - eY/2, x/2 + eX/2, y/2 + eY/2)
draw = ImageDraw.Draw(im)
draw.ellipse(bbox, fill=128)
del draw

im.save("output.png")
im.show()

Это дает следующий результат (1.jpg слева, output.png справа):

1.jpgoutput.png

Ответ 2

Функция эллипса рисует эллипс внутри ограничивающего прямоугольника . Поэтому вам нужно использовать draw.ellipse((40,40,60,60)) или другие координаты, где верхний левый размер меньше нижнего правого.