在 python PIL lib 中,我正在使用
>>> draw.ellipse((x - r, y - r, x + r, y + r))
画圆作为节点。但是,由于要绘制数以千计的节点,这需要很长时间。
有没有更快的方法来绘制我的所有节点?
对于背景:绘制树状图,以圆圈为节点。
在 python PIL lib 中,我正在使用
>>> draw.ellipse((x - r, y - r, x + r, y + r))
画圆作为节点。但是,由于要绘制数以千计的节点,这需要很长时间。
有没有更快的方法来绘制我的所有节点?
对于背景:绘制树状图,以圆圈为节点。
如果你在每个周期都画那么多椭圆,它会很慢。
您需要使用 PIL 是否有特定原因?从您的问题详细信息来看,我不确定 PIL 是否适合您的任务:您需要一个图形库,而不是图像处理库。它们是有区别的。
PyGame是适用于高性能绘图例程的 SDL 包装器。
一些技巧包括在表面上绘制一次,然后只重绘脏区域。这方面的教程可以在这里找到:
大多数图形编程新手使用第一个选项 - 他们每帧更新整个屏幕。问题是,这对大多数人来说速度太慢了。
该解决方案称为“脏矩形动画”。不是每帧更新整个屏幕,而是只更新自上一帧以来发生变化的部分。
我发现 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)