4-минутный гид по

Создайте свои гифки

чтобы сделать ваши истории более живыми

Это руководство посвящено созданию изображений в формате GIF с помощью Python. Он разделен на пять этапов:

  1. Выполнение необходимого импорта и подготовка данных
  2. Создание изображений
  3. Укладка изображений и создание GIF
  4. Очистка ненужных данных
  5. Исполнение

Я считаю, что этот метод поможет вам заменить статичные фигуры и иллюстрации на что-то завораживающее. Давайте начнем!

Шаг 1. Выполнение необходимого импорта и подготовка данных.

Для запуска кода у вас должен быть следующий импорт:

import imageio
import os
import matplotlib.pyplot as plt

Предположим, мы хотим построить два набора случайных данных. Для этого я создал три списка:

lst1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
lst2 = [5, 4, 3, 5, 6, 5, 8, 7, 8, 10, 5, 6]
lst3 = [9, 6, 6, 7, 6, 4, 6, 9, 11, 8, 7, 4]

lst1 представляет значения оси x для обоих наборов данных, а lst2 и lst3 представляют значения на оси y. При построении этих списков вы должны ожидать двух линий.

Шаг 2. Создание образов.

Чтобы создавать прогрессивные изображения, мы должны определить функцию, которая использует цикл for. В первой итерации он использует только одну точку данных для построения графика, а каждая следующая итерация имеет еще одну точку данных.

def createfiles():
    for i in range(1, 25):
        if i > 12:
            stopidx = 12
        else:
            stopidx = i
        fig = plt.figure(figsize=(6, 6))
        ax = fig.add_subplot(111)
        plt.yticks((1, 3, 5, 7, 9, 11, 13))
        ax.set_xticklabels([])
        ax.set(xlim=(0.5, 12.5), ylim=(0.000001, 13.99999))
        ax.plot(lst1[:stopidx], lst2[:stopidx], color="red")
        ax.plot(lst1[:stopidx], lst3[:stopidx], color="green")
        plt.savefig("img"+"{:02d}".format(int(i))+".png")

Вышеупомянутая функция работает следующим образом:

  1. Он выполняет итерацию цикла for, где начальный индекс равен 1, а конечный индекс больше, чем количество элементов, которые мы сохранили в списке.
  2. stopidx предназначен для нарезки наших массивов. Обычно мы хотели бы иметь только первую точку данных в первой итерации, две первые точки данных во второй итерации и т. Д. Если номер итерации больше, чем размер нашего списка, этот индекс вынужден быть равен нашему массиву размер.
  3. После этого оператора if-else мы создаем фигуру, настраиваем ее оси и добавляем к ней две строки. Простой!
  4. После построения нашей фигуры функция заканчивается сохранением фигуры.

Примечание: все имена файлов изображений содержат некоторую информацию о порядке. При работе со строками python считает, что img11.png должен быть перед img2.png. Поэтому все однозначные числа преобразуются в двухзначные. Например: «1» преобразуется в «01».

Шаг 3. Складываем изображения и создаем GIF.

Чтобы превратить эти изображения в одну волшебную гифку, давайте создадим еще одну функцию:

def creategif():
    path = 'C:/path/to/file/'
    image_folder = os.fsencode(path)
    filenames = []
    for file in os.listdir(image_folder):
        filename = os.fsdecode(file)
        if filename.endswith(('.jpeg', '.png')):
            filenames.append(path+filename)
    filenames.sort() # this iteration technique has no built in order, so sort the frames
    images = list(map(lambda filename: imageio.imread(filename), filenames))
    imageio.mimsave(os.path.join('example.gif'), images, duration = 0.5)

Это, вероятно, немного сложно уследить, и нам не следует углубляться в детали. Вы должны знать следующее:

  1. Изображения взяты из указанного вами пути. Измени это!
  2. Результат называется «example.gif». Не стесняйтесь переименовать этот вывод в своем коде.
  3. Длительность указывает, как долго отображается каждый кадр. В настоящее время он установлен на 0,5 секунды.
  4. Эта функция принимает в качестве входных данных изображения .jpeg и .png и предполагает, что они упорядочены в алфавитном порядке.

Внимание! При создании изображений я использовал один прием. Функция createfiles () создает 24 изображения, но у нас есть 12 точек данных. Таким образом, мы помещаем все движение в начало нашего GIF и перед его перезапуском мы получаем несколько секунд статического изображения.

Шаг 4. Очистка ненужных данных

На шаге 2 мы создали кучу файлов, и после создания GIF они, вероятно, нам не понадобятся. Чтобы быстро избавиться от них, добавьте в свой код следующее:

def deletefiles():
    for i in range(1, 25):
        os.remove("img"+"{:02d}".format(int(i))+".png")

Это очень похоже на

Шаг 5. Выполнение

Если вы выполнили предыдущие четыре шага, у вас должно быть три массива python и три функции. Назовем их так:

createfiles()
creategif()
deletefiles()

И это все! Теперь у вас должен быть ваш GIF-файл (example.gif) где-то в вашей папке, и вы заметите, что других файлов изображений нет.

Бонусный шаг. Как избежать предупреждений во время выполнения

Вероятно, вы получили RuntimeWarning:

RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory.

Чтобы он не появлялся, добавьте эту единственную строку перед вызовом функции createimages ():

plt.rc('figure', max_open_warning = 0)

Что дальше?

Теперь вы, вероятно, знаете по крайней мере на одну вещь больше, чем до того, как начали читать эту статью. Проявите творческий подход и попробуйте заменить свои статические изображения потрясающими движущимися изображениями.

Не стесняйтесь использовать суть, которую я сделал для этой статьи: