Преобразуйте тысячи.png в анимированные.gif, `convert` использует слишком много памяти

Многие из вопросов, спрашивающих, как создать анимированный GIF из набора изображений PNG, предлагают использовать вариант ImageMagick convert команда:

convert -delay 2 -loop 0 *.png animated.gif

Тем не менее, у меня есть несколько тысяч изображений и, таким образом, convert израсходует всю мою память, поменяется, а затем падает. Какое альтернативное программное обеспечение существует, которое больше заботится о памяти? Я мог бы использовать другой открытый формат, если .gif не поддерживается, и я предпочитаю инструмент CLI.

8 ответов

Похоже, вы пытаетесь сделать видео. Если это так, то я бы использовал правильный формат видео.

В этом случае я бы использовал ffmpeg для преобразования отдельных файлов PNG в видео H.264. Поскольку ffmpeg предназначен для работы с видео, которое может длиться часами, у вас не должно возникнуть проблем с тысячами изображений. Использование H.264 вместо анимированного GIF приведет к значительному улучшению качества изображения.

Нечто подобное должно работать для вас:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2: Это устанавливает частоту кадров в половину FPS, или 2 секунды на кадр.
  • -i img%04d.png: Это говорит ffmpeg читать файлы img0000.png хоть img9999.png,
  • -c:v libx264: Используйте видеокодек libx264.
    • Вы можете указать параметры сжатия видео здесь, если вам нравится:
    • -crf <number>: Настройка качества. От 0 до 51. 23 по умолчанию. 0 - это истинное кодирование без потерь, которое будет иметь достаточно высокую пропускную способность. 18 почти без визуальных потерь.
  • -r 30: Установите выходную частоту кадров 30 кадров в секунду. Каждое из входных изображений будет продублировано, чтобы сделать вывод, который вы указали здесь. Вы можете оставить этот параметр отключенным, и выходной файл будет с входной частотой кадров, но полученный фильм не отображался должным образом, когда я попробовал его только сейчас.
  • out.mp4: Имя выходного файла.

Рекомендации:

Лично я бы просто запустил его на ограниченном количестве файлов вместо всех сразу. Например, что-то вроде этого:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif

Использование -limit memory 1GiB ограничить объем памяти convert использует.

Тысячи изображений создадут огромный GIF-файл, который большинство компьютеров будет стараться показать. Я держу свои анимированные GIF-изображения ниже 200 изображений, когда это возможно. Чем меньше, тем лучше. Если вы пронумеруете свои изображения, эта команда удалит нечетные изображения rm *[13579].png,

Итак, вот мой типичный рабочий процесс для создания анимированного GIF из сцены фильма:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif

Если у вас есть тысячи PNG, формат anigif странный. Я бы сделал это таким образом, используя avconv:

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov

Я мог бы использовать другой открытый формат, если .gif не поддерживается

Возможно, APNG пригодится вам. Он поддерживается некоторыми браузерами, включая Firefox, но на данный момент, за исключением Chrome и IE. Поскольку это просто расширение PNG, конвертировать PNG в APNG очень просто. Инструмент apngasm может сделать это. Но формат настолько прост, что недавно я сам написал сборщик APNG для Sage. Адаптация этого кода была бы альтернативой.

В дополнение к другим ответам: поскольку вы хотите создать GIF-файл, я предполагаю, что вы хотите отобразить изображение на веб-странице. Если это так, я бы не стал конвертировать ваши PNG вообще. Просто Google для "слайд-шоу Javascript" и использовать один из миллионов бесплатных сценариев. Или написать свой, это действительно тривиально.

Преимущества этого метода:

  • в браузер загружается только одно изображение, слайд-шоу запускается быстро и не занимает много ОЗУ на компьютере пользователя.

  • решение масштабируется до миллионов изображений. Или миллиарды, если вы достаточно терпеливы, чтобы посмотреть их все:)

  • Вы можете добавить элементы управления на свою страницу, чтобы приостановить, перемотать назад, изменить задержку или перейти к определенному кадру.

gifsicle - это утилита командной строки для обработки анимации GIF. Если вы хотите обменять память на скорость, вы можете использовать ее ключ --conserve-memory.

Вы можете использовать apng2gifдобиться того же. Со страницы руководства :

       Progrmam apng2gif converts APNG into animated GIF format.

   The Animated Portable Network Graphics (APNG) file format is an extension to the Portable
   Network Graphics (PNG) specification. It allows for animated PNG files that work similarly
   to animated GIF files, while retaining backward compatibility with non-animated PNG files
   and adding support for 8-bit transparency and 24-bit images.

   Default run values are /t 128, no background color. A short syntax hlp is provided without
   any command line arguments.

Выполните следующую команду, чтобы установить пакет:

      sudo apt install apng2gif

Затем выполните следующую команду, чтобы преобразовать все .pngфайлы в .gif:

      find -type f -name "*.png" -exec apng2gif {} \;
Другие вопросы по тегам