Любой способ автоматически сжать файл .gif?

11

У меня есть 2,0 мб GIF, который я хочу сделать меньше, желательно, удалив несколько кадров.

Есть ли утилита командной строки или программа, которая сделает это автоматически?

Благодарю.

Чиба
источник
Возможно, вы захотите взглянуть на формат webm: это похоже на более оптимизированный GIF!

Ответы:

8

ImageOptim использует Gifsicle для сжатия Gif. Насколько я знаю, это работает довольно хорошо (я обычно не использую Gif в наши дни). С их сайта:

Оптимизируйте свои анимации! Это сохраняет только измененную часть каждого кадра и может радикально уменьшить ваши GIF-файлы. Вы также можете использовать прозрачность, чтобы сделать их еще меньше. Оптимизатор Gifsicle довольно мощный и обычно уменьшает анимацию до пары байтов от лучших коммерческих оптимизаторов.

Shauna
источник
6

Вы можете использовать GimpУстановить gimp для удаления некоторых кадров из GIF, а также для повторной оптимизации файла, снова сохранив его в GIF.

MrMassiveManMeat
источник
Как вы оптимизируете файл при сохранении в Gimp?
Орширо
2

Я использую 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 мс.

Луи Мэддокс
источник
1

Вы можете легко оптимизировать свой файл .gif на Gimp.

Просто сохраните как .gif и затем сожмите или вы можете сохранить в другом расширении как .jpeg или другое.

Хорхе Пинью
источник
1
Как вы сжимаете в Gimp?
Орширо