Answers:
我使用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例如使用50ms的帧延迟进行固定。