Ответы:
ImageOptim использует Gifsicle для сжатия Gif. Насколько я знаю, это работает довольно хорошо (я обычно не использую Gif в наши дни). С их сайта:
Оптимизируйте свои анимации! Это сохраняет только измененную часть каждого кадра и может радикально уменьшить ваши GIF-файлы. Вы также можете использовать прозрачность, чтобы сделать их еще меньше. Оптимизатор Gifsicle довольно мощный и обычно уменьшает анимацию до пары байтов от лучших коммерческих оптимизаторов.
Я использую ezgif.com/optimize , так как GIMP и другие инструменты плохо справляются с этой работой. Разница в том, что ezgif использует gifsicle
модификацию (с lossy
флагом), недоступную в apt
версии. См. Выпуск 1.82.1 здесь (замените /usr/bin/gifsicle
на соответствующий для вашей системы (двоичный файл заканчивается на -static
).
Мои заметки о полном процессе оптимизации GIF здесь .
Изменить : текущий скрипт, как он используется, будет обновлен на GitHub здесь
Я не буду описывать, как я делаю все это здесь, общая идея - несколько функций / псевдонимов bash:
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
(шаг, который уменьшит размер файла вдвое, отбрасывая каждый второй кадр).
Если вы это сделаете, скорость может измениться, gifspeedchange input-opt.gif 5
например, с помощью задержки кадра 50 мс.
Вы можете легко оптимизировать свой файл .gif на Gimp.
Просто сохраните как .gif и затем сожмите или вы можете сохранить в другом расширении как .jpeg или другое.