Alguma maneira de compactar automaticamente um arquivo .gif?


11

Eu tenho um gif de 2.0 mb que quero diminuir, de preferência removendo alguns quadros.

Existe um utilitário de linha de comando ou um programa que fará isso por mim automaticamente?

Obrigado.


Você pode querer olhar para o formato webm: é como um gif mais otimizado!

Respostas:


8

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.



2

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 gifsiclemodificação (com um lossysinalizador), não disponível na aptversão. Consulte o release 1.82.1 aqui (substitua /usr/bin/gifsiclepelo 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 --lossysinalizador 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, gifoptvocê 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 --batchsinalizador para edição no local, mas eu não recomendo substituir o material inicial.

Essa função também funciona para remover qualquer _reduced_xsufixo 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 5por exemplo, para usar um atraso de quadro de 50ms.


1

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.


1
Como você comprime no Gimp?
Orschiro 13/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.