在python PIL lib中,我正在使用
>>> draw.ellipse((x - r, y - r, x + r, y + r))
将圆圈绘制为节点。但是,由于要绘制数千个节点,因此需要很长时间 是否有更快的方法来绘制我的所有节点?
对于背景:绘制树状图,以圆圈作为节点。
答案 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)