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

Многие из выяснение вопросов как создать анимированный gif от набора из изображений png предлагают использовать вариант ImageMagick convert команда:

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

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

28
задан 13 April 2017 в 05:23

7 ответов

Это кажется, что Вы пытаетесь сделать видео. Если это так, тогда я использовал бы надлежащий формат видео.

В этом случае, я использовал бы 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: Произведите имя файла.

Ссылки:

33
ответ дан 23 November 2019 в 00:56

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

#!/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
11
ответ дан 23 November 2019 в 00:56

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

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

4
ответ дан 23 November 2019 в 00:56

Если у Вас есть тысячи png-s, формат anigif является странным. Я сделал бы это таким образом, с помощью avconv:

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
3
ответ дан 23 November 2019 в 00:56

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

2
ответ дан 23 November 2019 в 00:56

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

преимущества выполнения его этот путь:

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

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

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

2
ответ дан 23 November 2019 в 00:56

Использовать -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
8
ответ дан 23 November 2019 в 00:56

Другие вопросы по тегам:

Похожие вопросы: