Python PIL:如何在图像中间绘制椭圆?

12 投票
2 回答
43512 浏览
提问于 2025-04-16 10:34

我在让这段代码正常运行时遇到了一些麻烦:

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)的位置画一个40x40像素的椭圆。但是图像什么都没有显示。

不过,这段代码是可以正常工作的:

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

我发现,当我改变椭圆应该放置的前两个坐标时,如果这些坐标的值大于椭圆的大小,它就不会工作。例如:

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

这个是可以的,但只显示了矩形的一部分。而

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

这个根本什么都不显示。

画矩形的时候也是这样。

2 个回答

3

ellipse函数可以在一个边界框内画出一个椭圆。所以你需要使用像draw.ellipse((40,40,60,60))这样的代码,或者其他坐标,确保左上角的坐标比右下角的坐标小。

22

边界框是一个包含四个数字的元组 (x0, y0, x1, y1),其中 (x0, y0) 是这个框的左上角坐标,而 (x1, y1) 是右下角的坐标。

如果你想在图片的中心画一个椭圆,你需要先确定这个椭圆的边界框有多大(在我下面的代码示例中,变量 eXeY 就是用来设置这个大小的)。

接下来,下面是一个可以在图片中心画椭圆的代码示例:

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

撰写回答