У меня есть папка с видео, которую я хочу преобразовать в анимированные GIF-файлы. ffmpeg / avconv плохо справляется с работой напрямую, поэтому вместо этого я конвертирую видео в gif, сначала выводя каждый кадр в формате png, а затем конвертируя обратно в gif, используя imagemagick. Проблема в том, что это приводит к большому GIF с точки зрения размера файла. Чтобы решить эту проблему, я хочу «удалить» каждый второй или n-й кадр из GIF, либо пропуская каждый файл изображения при преобразовании в GIF, либо удаляя кадры из GIF. Как я могу сделать это в Ubuntu (13.04), используя imagemagick или другую утилиту командной строки?
источник
let i=0; while [[ $i -lt $(($numframes / 2)) ]]; do gifsicle $2 --delete "#$i" -o $2; let i=i+1; done
gifsicle "$1" --unoptimize $(seq -f "#%g" 0 2 $numframes) -O2 -o "$2"
он сделает это за один вызов.chmod +x gifdrop.sh
Вот более простое решение с использованием gifsicle, чем сценарий JohnB:
Эта команда должна работать в большинстве оболочек Unix; Я проверял это в bash. Замените
input.gif
иoutput.gif
на имена входных и выходных файлов, и99
на количество кадров в вашей анимации. (Можно использовать большее число, но Gifsicle будет жаловаться на это.)Некоторые заметки:
-U
Коммутатор будет объединить кадры во входной анимации с предыдущими, так что каждая из кадров стоит отдельно и не зависит ни в каких других. Вы действительно хотите сделать это, прежде чем делать что-либо с анимацией, иначе вы можете получить грязные результаты. (Если ваша входная анимация уже неоптимизирована, gifsicle может напечатать предупреждение об этом, но это также совершенно безвредно.)И наоборот,
-O2
коммутатор повторно оптимизирует выходную анимацию, чтобы минимизировать размер файла. С образцом анимации JohnB, он уменьшает размер вывода на 27%.Команда
seq
просто выводит последовательность чисел от 0 до 99, считая с шагом 2. Она-f "#%g"
заставляет печатать#
перед каждым числом, что позволяет gifsicle понимать его как выбор кадра вместо имени файла. Функция backticks (`
) вокруг команды seq приводит к тому, что ее вывод включается в качестве параметров в командную строку gifsicle.Если вы не хотите, чтобы изображение ускорялось, вы можете использовать,
gifsicle -I input.gif
чтобы получить текущую задержку кадра, умножить ее на 2 и использоватьgifsicle -d ${delay} ...
.источник
gifsicle input.gif `seq -f "#%g" 0 2 $(identify input.gif | tail -1 | cut -d "[" -f2 - | cut -d "]" -f1 -)` --unoptimize -O2 -o output.gif
useless unoptimization-related input option
. Итак, я сделал это в два этапа (из Git Bash): 1.gifsicle -U -o unoptimized.gif input.gif
2.gifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
Использование Photoshop
Это не решение с открытым исходным кодом или командная строка, но вы можете сделать это с помощью Photoshop:
Файл ▸ Импорт ▸ Видеокадры в слои ...
" Limit To Every __ Frames " поможет вам
источник
Вот мое решение с использованием пакетной обработки сценариев ...
Сначала скопируйте захваченный оригинал анимированного GIF-файла в файл input.gif, затем запустите интерпретатор команд и введите:
gifsicle input.gif -I "# -1"> input.txt
загляните в input.txt и посмотрите, какая длина анимации - сколько кадров она содержит ...
input.txt:
затем отредактируйте-создайте test.bat и измените значение переменной len = define_length_number_from_input.txt и сохраните test.bat ...
test.bat:
затем, наконец, запустите process1.bat и process2.bat и обрезанная анимация с каждым нечетным кадром будет обработана в файл input.gif
process1.bat:
process2.bat:
источник
Я думаю, что мне нужно новое более сложное объяснение (задержка кадра также важная вещь, которую следует учитывать) ... Для этого нового процесса вам нужно скачать JREPL.BAT по этой ссылке: http://www.dostips.com /forum/viewtopic.php?t=6044
Сначала скопируйте захваченный gif в файл input.gif, затем запустите интерпретатор команд и введите:
gifsicle input.gif -I "# -1"> input.txt
посмотрите на input.txt и посмотрите, какова длина анимации - сколько кадров она содержит ... также посмотрите на задержку кадра, и если она равна 0.07 с, это означает, что вы должны поместить опцию -d14 (7 мс * 2) в эту строку в process.cmd: gifsicle -b -U -d14 input.gif, после редактирования сохраните process.cmd
затем отредактируйте test.bat и измените значение переменной 166 из этой строки, чтобы оно соответствовало количеству кадров анимации: for / L %% i IN (1,2,166) DO echo "# %% i" >> input.bat, после редактировать сохранить test.bat ...
затем запустите process.cmd и обрезанная анимация с каждым нечетным кадром будет обработана в файле input.gif
PS Преимущество этого метода также в том, что у вас есть полный контроль над тем, что вы хотите удалить из GIF (каждый второй кадр (1,2166) или каждый третий (1,3,166)) и т. Д. Просто измените среднее число в в пакетном режиме, но имейте в виду, что если вы укажете (1,3166), вам следует соответственно изменить -d14 (опция задержки) из process.cmd, чтобы отразить изменение (7 мсек * 3/2 = 10), поэтому вместо (7 мсек * 2) / 1 = 14), опция для задержки должна быть -d10 ...
Другие файлы (например, удаление каждого второго кадра): test.bat:
process.cmd:
И вспомогательный readme файл input.txt:
источник