2

在 python PIL lib 中,我正在使用

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

画圆作为节点。但是,由于要绘制数以千计的节点,这需要很长时间。
有没有更快的方法来绘制我的所有节点?

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

4

2 回答 2

5

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

您需要使用 PIL 是否有特定原因?从您的问题详细信息来看,我不确定 PIL 是否适合您的任务:您需要一个图形库,而不是图像处理库。它们是有区别的。

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

一些技巧包括在表面上绘制一次,然后只重绘脏区域。这方面的教程可以在这里找到

大多数图形编程新手使用第一个选项 - 他们每帧更新整个屏幕。问题是,这对大多数人来说速度太慢了。

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

于 2012-12-21T09:05:15.517 回答
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)
于 2012-12-25T07:27:28.837 回答