У меня есть 2,0 МБ gif, я хочу сделать меньшим, предпочтительно путем отбрасывания некоторых кадров.
Существует ли утилита командной строки или программа, которая сделает это для меня автоматически?
Спасибо.
ImageOptim использует Gifsicle для своего сжатия Gif. Насколько я знаю, это работает вполне хорошо (я обычно не использую Gif в эти дни). От их сайта:
Оптимизируйте свои анимации! Это хранит только измененную часть каждого кадра и может радикально уменьшить Ваш GIFs. Можно также использовать прозрачность для создания их еще меньшими. Оптимизатор Gifsicle довольно мощен, и обычно уменьшает анимации до в паре байтов лучших коммерческих оптимизаторов.
Можно использовать Калека для удаления некоторых кадров из GIF, а также переоптимизации файла путем сохранения его назад к GIF снова.
Можно оптимизировать .gif файл на Калеке легко.
Просто Сохраните как .gif и затем сожмитесь, или можно сохранить в другом расширении как .jpeg или другой.
Я использую ezgif.com/optimize, поскольку GIMP и другие инструменты не хороши в этом задании. Различие - это, ezgif использует a gifsicle
модификация (с a lossy
флаг), не доступный на apt
версия. Посмотрите выпуск 1.82.1 здесь (замена /usr/bin/gifsicle
с соответствующим для Вашей системы (двоичное окончание -static
).
Мои примечания по полному gif рабочему процессу оптимизации здесь.
Править: текущий сценарий, как сохранил используемым, будет обновлен на GitHub здесь
Я не опишу, как я делаю все это здесь, общее представление является несколькими функциями/псевдонимами удара:
function gifopt() {
# args: $input_file ($loss_level)
if [ -z "$2" ]
then
# use default of 30
local loss_level=30
elif [[ "$2" =~ ^[0-9]+$ ]] && [ "$2" -ge 30 -a "$2" -le 200 ]
then
local loss_level=$2
else
echo "${2:-"Loss level parameter must be an integer from 30-200"}" 1>&2
exit 1
fi
local inputgif="${1?'Missing input file parameter'}"
local gifname="$(basename $inputgif .gif)"
local basegifname=$(echo "$gifname" | sed 's/_reduced_x[0-9]//g')
local outputgif="$basegifname-opt.gif"
gifsicle -O3 --lossy="$loss_level" -o "$outputgif" "$inputgif";
local oldfilesize=$(du -h $inputgif | cut -f1)
local newfilesize=$(du -h $outputgif | cut -f1)
echo "File reduced from $oldfilesize to $newfilesize as $outputgif"
}
function gifopt() {
# args: $input_file ($loss_level)
if [ -z "$2" ]
then
# use default of 30
loss_level=30
elif [[ "$2" =~ ^[0-9]+$ ]] && [ "$2" -ge 30 -a "$2" -le 200 ]
then
loss_level=$2
else
echo "${2:-"Loss level parameter must be an integer from 30-200"}" 1>&2
exit 1
fi
local inputgif="${1?'Missing input file parameter'}"
local gifname="$(basename $inputgif .gif)"
local basegifname=$(echo "$gifname" | sed 's/_reduced_x[0-9]//g')
local outputgif="$basegifname-opt.gif"
gifsicle -O3 --lossy="$loss_level" -o "$outputgif" "$inputgif";
local oldfilesize=$(du -h $inputgif | cut -f1)
local newfilesize=$(du -h $outputgif | cut -f1)
echo "File reduced from $oldfilesize to $newfilesize as $outputgif"
}
function gifspeedchange() {
# args: $gif_path $frame_delay (1 = 0.1s)
local orig_gif="${1?'Missing GIF filename parameter'}"
local frame_delay=${2?'Missing frame delay parameter'}
gifsicle --batch --delay $frame_delay $orig_gif
local newframerate=$(echo "$frame_delay*10" | bc)
echo "new GIF frame rate: $newframerate ms"
}
--lossy
флаг берет целое число от 30 до 200, таким образом, по высшему качеству:
gifsicle -O3 --lossy=30 -o output.gif input.gif
С вышеупомянутой функцией gifopt
Вы могли упростить ситуацию, так как это принимает значение по умолчанию к 30
gifopt input.gif
... вывод автоматически назвали бы input-opt.gif
. Вы могли изменить функцию для использования --batch
флаг для оперативного редактирования, но я не рекомендовал бы перезаписать Ваш исходный материал.
Та функция также работает для удаления любого _reduced_x
суффикс, добавленный кадром, считает функцию сокращения, т.е. у Вас мог быть промежуточный файл input_reduced_x2.gif
(шаг, который был бы ~halve размер файла путем отбрасывания любого кадра).
Если Вы действительно делали это, скорость может измениться, зафиксированный с gifspeedchange input-opt.gif 5
например, для использования задержки кадра на 50 мс.
Обрезать часть цветовой палитры 512, 256, 128 и т.д.... См. здесь:
Используйте gifsicle (доступно для Mac OS X, Windows, DOS, Debian, FreeBSD и NetBSD).
gifsicle -i anim.gif -O3 --colors 256 -o anim-opt.gif
некоторые примеры https://superuser.com/questions/1107200/optimize-animated-gif-size-in-command-line