有什么方法可以自动压缩.gif文件?


11

我有一个2.0 MB的gif,要缩小,最好是掉一些框架。

是否有命令行实用程序或程序会自动为我执行此操作?

谢谢。


您可能想研究一下webm格式:就像更优化的gif!

Answers:


8

ImageOptim使用Gifsicle进行Gif压缩。据我所知,它运行良好(这些天我通常不使用Gif)。从他们的网站:

优化动画!这仅存储每个帧的更改部分,并且可以从根本上缩小GIF。您也可以使用透明度使它们更小。Gifsicle的优化器功能非常强大,通常会将动画的数量减少到最佳商业优化器的几个字节之内。


6

您可以使用Gimp安装gimp从GIF中删除某些帧,以及通过将文件再次保存回GIF来重新优化文件。


保存到Gimp后,如何重新优化文件?
orschiro

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


1

您可以轻松地在Gimp上优化.gif文件。

只需另存为.gif,然后进行压缩,也可以将其他扩展名另存为.jpeg或其他。


1
您如何在Gimp中压缩?
orschiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.