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的帧延迟进行固定。