2016-07-03 35 views
1

我有一个数据库(x,y)随着时间的推移聚集在一个图像上。为了获得更好的数据表示,我希望在出现时生成图像的帧和(x,y)坐标上的圆。我设法用下面的代码来做到这一点,但是在我看来,这需要太多的时间(视频长度为4250帧,并且必须多次完成,才能进行单独的数据收集)。我正在寻找的是对内存中最初加载的Image的使用进行优化的可能性,因此不会为每一帧重新加载,而是一劳永逸地加载。pil python多重图像独立绘制

subprocess.call(['mkdir', install_path + 'users/' + user.name + '/temp']) 
# creates a temporary folder for the pngs generated 
r = 8 

for i in range(0, 4250, 1): 
    valaro = Image.open('pngs/valaro_800.png') 
    draw = ImageDraw.Draw(valaro) 
    for d in data: 
     if (d.reeltime + 5) * 25 > i > (d.reeltime - 5) * 25: 
      # interpret the data to fit on the picture 
      xl = d.x * 2.91 + 392 
      yl = d.y * -3.06 + 434 

      draw.ellipse((xl - r, yl - r, xl + r, yl + r), fill='green') 
    valaro.save('users/' + user.name + '/temp/' + user.name + str(i) + '.png') 

在此先感谢您的答复

回答

0

你可以改变...

for i in range(0, 4250, 1): 
    valaro = Image.open('pngs/valaro_800.png') 

...到...

original = Image.open('pngs/valaro_800.png') 
for i in range(0, 4250, 1): 
    valaro = original.copy() 

...这样的图像只装载一次,但我怀疑这只会提供较小的性能增益。

+0

感谢您的回复,只是测试了差异:在RAM的i7 3630QM/16Gio上获得了31s(2m 29secs与3m 1sec)。实际上这并不错,但我不知道是否我们可以用相同的软件包和语言配置进一步推动事情。 – Xander

+0

@Xander我怀疑大部分时间都花在'valaro.save()'调用上,正如你所说的,它必须将4,250个PNG文件写入磁盘。我认为这些文件只是用作另一个创建视频文件的工具的临时输入。根据视频需要的格式,可能会有更好的方法。无论哪种方式,如果临时文件存储在[RAM磁盘](https://en.wikipedia.org/wiki/RAM_drive)上,您可能会获得更显着的性能提升。 – Aya

+0

准确。我使用带叠加过滤器的ffmpeg来呈现与原始视频同步的图表上收集的数据。没有具体的视频格式需求,我可以将PNG封装在.MOV容器中,但MOV/H.264最终将节省空间。我想我们可以在RAM中生成所有PNG并直接生成MOV/PNG文件,然后在MOV/H.264中重新编码以节省空间。如果python和PIL允许我做这样的内存操作。 – Xander