Многие из выяснение вопросов как создать анимированный gif от набора из изображений png предлагают использовать вариант ImageMagick convert
команда:
convert -delay 2 -loop 0 *.png animated.gif
Однако у меня есть несколько тысяч изображений и таким образом convert
израсходовал всю мою память, подкачку, и затем отказывает. Какое альтернативное программное обеспечение существует, который более сознателен память? Я мог использовать другой открытый формат если .gif
не поддерживается, и я действительно предпочитаю инструмент CLI.
Это кажется, что Вы пытаетесь сделать видео. Если это так, тогда я использовал бы надлежащий формат видео.
В этом случае, я использовал бы 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
: Это устанавливает framerate на половину кадр/с, или 2 секунды на кадр. -i img%04d.png
: Это говорит ffmpeg читать файлы img0000.png
хотя img9999.png
. -c:v libx264
: Используйте видеокодек libx264. -crf <number>
: установка Quality. От 0 до 51. 23 значение по умолчанию. 0 истинное кодирование без потерь, которое будет довольно широкополосным. 18 почти визуально без потерь. -r 30
: Установите вывод framerate на 30 кадр/с. Каждое из входных изображений будет дублировано для создания вывода, что Вы определяете здесь. Можно оставить этот параметр, и выходной файл будет во входе framerate, но получающийся фильм не отображался правильно, когда я попробовал его сейчас. 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
Я мог бы использовать другой открытый формат, если
blockquote>.gif
не поддерживаетсяВозможно, APNG будет вам полезен. Он поддерживается некоторыми браузерами , включая Firefox, но на данный момент исключая Chrome и IE. Поскольку это просто расширение PNG, очень просто конвертировать PNG в APNG. Инструмент apngasm может это сделать. Но формат настолько прост, что недавно я сам написал сборщик APNG для Sage. Адаптация к этому коду будет альтернативой.
Если у Вас есть тысячи png-s, формат anigif является странным. Я сделал бы это таким образом, с помощью avconv
:
avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
gifsicle является утилитой командной строки для обработки анимаций GIF. Если Вы готовы обменять память на скорость, можно использовать - переключатель сохранять-памяти.
В дополнение к другим ответам: так как Вы хотите произвести файл GIF, я предполагаю, что Вы хотите отобразить изображение на веб-странице. Если так, я не потрудился бы преобразовывать Ваш PNGs вообще. Просто Google для "слайд-шоу JavaScript" и использования один из миллионов бесплатных сценариев. Или запишите свое собственное, это действительно тривиально.
преимущества выполнения его этот путь:
только одно изображение загружается в браузере в любое время, слайд-шоу запускается быстро и не использует много RAM на машине пользователя.
решение масштабируется к миллионам изображений. Или миллиарды, если Вы достаточно терпеливы для наблюдения их всех:)
можно добавить средства управления к странице, чтобы приостановить, перемотать, изменить задержку или перейти к конкретному кадру.
Использовать -limit memory 1GiB
ограничить объем памяти convert
использование.
1000-е изображений создали бы огромный GIF, который большинство компьютеров будет изо всех сил пытаться отобразить. Я сохраняю свой анимированный GIFs ниже 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