Неправильный порядок кадров при создании GIF-анимации из файлов PNG - PullRequest
0 голосов
/ 27 января 2020

Я сохраняю GIF-файл из нескольких файлов PNG, которые я создаю внутри al oop. Я не могу сохранить PNG с правильным именем, потому что при переводе в GIF я получаю неправильный порядок кадров. Следующий код - именно то, что мне нужно, но с неправильным порядком кадров. Большое спасибо, я новичок в python.

# basic animated mod 39 wheel in python
import glob
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np 
plt.close()
plt.rcParams.update({
    "lines.color": "white",
    "patch.edgecolor": "white",
    "text.color": "lightgray",
    "axes.facecolor": "black",
    "axes.edgecolor": "lightgray",
    "axes.labelcolor": "white",
    "xtick.color": "white",
    "ytick.color": "white",
    "grid.color": "lightgray",
    "figure.facecolor": "black",
    "figure.edgecolor": "black",
    "savefig.facecolor": "black",
    "savefig.edgecolor": "black"})
plt.xlabel('real axis')
plt.ylabel('imaginary axis')
plt.title('events constellation')
plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.gca().set_aspect('equal', adjustable='box')
#for fullscreen plt.draw just reinforces de rendering?
#plt.draw()
#mng = plt.get_current_fig_manager()
#mng.full_screen_toggle()

for n in range(1,40):

    cnums = 3 * np.exp(1j * 2 * np.pi * (1/39) * n)
    x = cnums.real 
    y = cnums.imag 
    plt.scatter(x, y , label="event", marker="o", color="blue", s=250)
    #plt.pause(1)
    plt.savefig(f'/outpng/img{n}.png',dpi=100)



# filepaths
fp_in = "/outpng/*.png"
fp_out = "/outpng/image.gif"

# https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif
img, *imgs = [Image.open(f) for f in sorted(glob.glob(fp_in))]
img.save(fp=fp_out, format='GIF', append_images=imgs,
         save_all=True, duration=600, loop=0)

1 Ответ

1 голос
/ 27 января 2020

Если я правильно понимаю, у вас есть:

lst_files = glob.glob(fp_in)
>>> ['/outpng/img28.png', '/outpng/img4.png', '/outpng/img20.png', '/outpng/img32.png', '/outpng/img36.png', '/outpng/img11.png', '/outpng/img1.png', '/outpng/img9.png', '/outpng/img24.png', '/outpng/img35.png', '/outpng/img7.png', '/outpng/img12.png',]

И вы хотите, чтобы файлы были «в порядке» (предположительно, номер - это порядок изображений). Вы можете сделать это, используя:

import re

def get_number(file_name):
    m = re.findall('img([0-9]*)\.', file_name)[0]
    return int(m)

lst_files = ['/outpng/img28.png', '/outpng/img4.png', '/outpng/img20.png', '/outpng/img32.png', '/outpng/img36.png', '/outpng/img11.png', '/outpng/img1.png', '/outpng/img9.png', '/outpng/img24.png', '/outpng/img35.png', '/outpng/img7.png', '/outpng/img12.png']
lst_numbers = [get_number(i) for i in lst_files]

lst_number_files = sorted(list(zip(lst_numbers, lst_files)))
lst_files_sorted = [i[1] for i in lst_number_files]

Как это работает:

  1. вы найдете число в строке (используя re.findall), которое соответствует 'imgX.' где X - ваш номер
  2. , вы сопоставляете числа с именами файлов
  3. , вы сортируете файлы по номеру
  4. , вы сглаживаете список, содержащий только имена файлов

Теперь вы можете использовать этот список, чтобы сделать свой GIF:

img, *imgs = [Image.open(f) for f in lst_files_sorted]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...