﻿ Python PIL: How to draw an ellipse in the middle of an image? - DeveloperSite- developersite.org

# Python PIL: How to draw an ellipse in the middle of an image?

Keywords：python

Question:

I seem to be having some trouble getting this code to work:

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

This should draw an ellipse at (60,60) which is 40 by 40 pixels. The image returns nothing.

This code works fine however:

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

It just seems that when i change the first 2 co-ords (for where the ellipse should be placed) it won't work if they are larger than the size of the ellipse to be drawn. For example:

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

Works, but only shows part of the rect. Whereas

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

shows nothing at all.

This happens when drawing a rectangle too.

The bounding box is a 4-tuple `(x0, y0, x1, y1)` where `(x0, y0)` is the top-left bound of the box and `(x1, y1)` is the lower-right bound of the box.

To draw an ellipse to the center of the image, you need to define how large you want your ellipse's bounding box to be (variables `eX` and `eY` in my code snippet below).

With that said, below is a code snippet that draws an ellipse to the center of an image:

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

This yields the following result (`1.jpg` on left, `output.png` on right):

The ellipse function draws an ellipse within a bounding box. So you need to use `draw.ellipse((40,40,60,60))` or other coordinates where the top left is smaller than the bottom right.