Respostas:
O ImageOptim usa o Gifsicle para sua compactação de GIF. Até onde eu sei, funciona muito bem (geralmente não uso Gif atualmente). Do site deles:
Otimize suas animações! Isso armazena apenas a parte alterada de cada quadro e pode reduzir radicalmente seus GIFs. Você também pode usar a transparência para torná-los ainda menores. O otimizador do Gifsicle é bastante poderoso e geralmente reduz as animações para alguns bytes dos melhores otimizadores comerciais.
Você pode usar o Gimp para remover alguns quadros do GIF e otimizar novamente o arquivo, salvando-o novamente em um GIF.
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 gifsicle
modificação (com um lossy
sinalizador), não disponível na apt
versão. Consulte o release 1.82.1 aqui (substitua /usr/bin/gifsicle
pelo apropriado para o seu sistema (o binário que termina com -static
)).
Minhas anotações sobre um fluxo de trabalho de otimização de gif completo estão aqui .
Editar : o script atual como mantido em uso será atualizado no GitHub aqui
Não vou descrever como faço tudo aqui, a ideia geral são algumas funções / aliases do 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"
}
O --lossy
sinalizador leva um número inteiro de 30 a 200, para melhor qualidade:
gifsicle -O3 --lossy=30 -o output.gif input.gif
Com a função acima, gifopt
você pode simplificar as coisas, pois o padrão é 30
gifopt input.gif
... a saída seria nomeada automaticamente input-opt.gif
. Você pode alterar a função para usar o --batch
sinalizador para edição no local, mas eu não recomendo substituir o material inicial.
Essa função também funciona para remover qualquer _reduced_x
sufixo adicionado pela função de redução de contagem de quadros, ou seja, você pode ter um arquivo intermediário input_reduced_x2.gif
(uma etapa que reduziria pela metade o tamanho do arquivo ao eliminar todos os outros quadros).
Se você fez isso, a velocidade pode mudar, corrigida, gifspeedchange input-opt.gif 5
por exemplo, para usar um atraso de quadro de 50ms.
Você pode otimizar seu arquivo .gif no Gimp facilmente.
Basta salvar como .gif e comprimir ou você pode salvar em outra extensão como .jpeg ou outro.