Eu uso ezgif.com/optimize , pois o GIMP e outras ferramentas não são boas neste trabalho. A diferença é que o ezgif usa uma modificação gifsicle
(com um sinal lossy
), não disponível na versão apt
. Veja o release 1.82.1 aqui (substitua /usr/bin/gifsicle
pelo apropriado para o seu sistema (o final binário com -static
).
Minhas notas sobre um fluxo de trabalho de otimização de gif completo são aqui .
Editar : o script atual mantido em uso será atualizado no GitHub aqui
Não vou descrever como faço tudo aqui, a ideia geral é de algumas funções / aliases bash:
function gifopt() {
# args: $input_file ($loss_level)
if [ -z "" ]
then
# use default of 30
local loss_level=30
elif [[ "" =~ ^[0-9]+$ ]] && [ "" -ge 30 -a "" -le 200 ]
then
local loss_level=
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 "" ]
then
# use default of 30
loss_level=30
elif [[ "" =~ ^[0-9]+$ ]] && [ "" -ge 30 -a "" -le 200 ]
then
loss_level=
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"
}
O sinalizador --lossy
usa um número inteiro de 30 a 200, portanto, para melhor qualidade:
gifsicle -O3 --lossy=30 -o output.gif input.gif
Com a função acima gifopt
você pode simplificar, já que o padrão é 30
gifopt input.gif
... a saída seria automaticamente denominada input-opt.gif
. Você poderia alterar a função para usar o sinal --batch
para edição no local, mas eu não recomendaria substituir seu material inicial.
Essa função também funciona para remover qualquer sufixo _reduced_x
adicionado pela função de redução da contagem de quadros, ou seja, você pode ter um arquivo intermediário input_reduced_x2.gif
(uma etapa que reduziria o tamanho do arquivo descartando todos os outros quadros). p>
Se você fez isso, a velocidade pode mudar, fixada com gifspeedchange input-opt.gif 5
, por exemplo, para usar um atraso de 50 ms.