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

У меня есть 2,0 МБ gif, я хочу сделать меньшим, предпочтительно путем отбрасывания некоторых кадров.

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

Спасибо.

11
задан 14 June 2011 в 22:31

5 ответов

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

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

8
ответ дан 23 November 2019 в 04:00

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

6
ответ дан 23 November 2019 в 04:00

Можно оптимизировать .gif файл на Калеке легко.

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

1
ответ дан 23 November 2019 в 04:00

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

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

Обрезать часть цветовой палитры 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

0
ответ дан 24 June 2020 в 21:54

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

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