如何加速在Python PIL中绘制多个圆圈

时间:2012-12-21 07:28:29

标签: python python-imaging-library

在python PIL lib中,我正在使用

>>> draw.ellipse((x - r, y - r, x + r, y + r))  

将圆圈绘制为节点。但是,由于要绘制数千个节点,因此需要很长时间 是否有更快的方法来绘制我的所有节点?

对于背景:绘制树状图,以圆圈作为节点。

2 个答案:

答案 0 :(得分:5)

如果你在每个周期画出那么多个椭圆,那就会很慢。

您需要使用PIL的具体原因是什么?从你的问题细节来看,我不确定PIL是否适合你的任务:你需要一个图形库,而不是一个图像处理库。有区别。

PyGame是一个适用于高性能绘图程序的SDL包装器。

一些技巧包括绘制到surface一次,然后只重绘脏区域。 A tutorial of this can be found here

  

大多数图形编程新手使用第一个选项 - 他们每帧更新整个屏幕。问题是,对于大多数人来说这是慢得令人无法接受的。

     

该解决方案称为“脏矩形动画”。而不是每帧更新整个屏幕,只更新自上一帧以来更改的部分。

答案 1 :(得分:2)

我发现image.paste()将速度提高到约5倍。有一个透明的问题,以避免重叠,所以掩码使速度慢一点。

def init_circle(r):
    center = [r] * 2
    im = Image.new(IMG_MODE, [r * 2] * 2, FG_COLOR)
    draw = ImageDraw.Draw(im) 
    draw.setink(BG_COLOR)
    draw.ellipse((1, 1, r * 2 - 1, r * 2 - 1), fill=NODE_COLOR)
    mask = invert(im.convert('L'))
    return im.crop((0, 0) + (r * 2, r * 2)), mask

使用它:

im.paste(circle, (x, y, x + 2 * r, y + 2 * r), mask=mask)