2016-07-03 87 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