Python PIL: Как нарисовать эллипс в середине изображения? - PullRequest
10 голосов
/ 25 января 2011

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

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)

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

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

Ответы [ 2 ]

15 голосов
/ 25 января 2011

Ограничивающий прямоугольник представляет собой 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.jpg output.png

3 голосов
/ 25 января 2011

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

...