2011-01-25 296 views
10

que parecen estar teniendo algunos problemas para conseguir que este código funcione:Python PIL: ¿Cómo dibujar una elipse en el medio de una imagen?

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

esto debe dibujar una elipse al (60,60), que es de 40 por 40 píxeles. La imagen no devuelve nada.

Este código funciona bien, sin embargo:

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

Simplemente parece que cuando cambio los 2 primeros compañeros de ords (por donde la elipse debe colocarse) no va a funcionar si son más grandes que la tamaño de la elipse que se dibujará Por ejemplo:

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

Funciona, pero solo muestra parte del rect. Mientras que

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

muestra nada en absoluto.

Esto ocurre al dibujar un rectángulo también.

Respuesta

15

El cuadro delimitador es un 4-tuple (x0, y0, x1, y1) donde (x0, y0) es el límite superior izquierdo del cuadro y (x1, y1) es el límite inferior derecho del cuadro.

Para dibujar una elipse en el centro de la imagen, debe definir qué tan grande quiere que sea el cuadro delimitador de su elipse (variables eX y eY en mi fragmento de código a continuación).

Dicho esto, a continuación es un fragmento de código que dibuja una elipse con el centro de una imagen:

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

Esto produce el siguiente resultado (1.jpg a la izquierda, output.png a la derecha):

1.jpgoutput.png

+0

Gracias - la idea de los cuadros delimitadores era nueva para mí, así que estaba un poco confundido aquí. Gracias por la gran explicación y ejemplo :) – Tommo

+0

Me alegra ayudar :). – sahhhm

3

La función elipse dibuja una elipse dentro de un cuadro delimitador . Por lo tanto, debe utilizar draw.ellipse((40,40,60,60)) u otras coordenadas donde la esquina superior izquierda es más pequeña que la inferior derecha.

Cuestiones relacionadas