Un modo per comprimere automaticamente un file .gif?


11

Ho una gif da 2.0 mb che voglio ridurre, preferibilmente facendo cadere alcuni frame.

Esiste un'utilità da riga di comando o un programma che lo farà automaticamente per me?

Grazie.


Potresti voler esaminare il formato webm: è come una gif più ottimizzata!

Risposte:


8

ImageOptim utilizza Gifsicle per la sua compressione Gif. Per quanto ne so, funziona abbastanza bene (di solito non uso Gif in questi giorni). Dal loro sito:

Ottimizza le tue animazioni! Ciò memorizza solo la parte modificata di ciascun fotogramma e può ridurre radicalmente le GIF. Puoi anche usare la trasparenza per renderli ancora più piccoli. L'ottimizzatore di Gifsicle è piuttosto potente e di solito riduce le animazioni a un paio di byte dai migliori ottimizzatori commerciali.


6

Puoi usare GimpInstalla gimp per rimuovere alcuni frame dalla GIF e per riottimizzare il file salvandolo di nuovo in una GIF.


Come si ottimizza nuovamente il file durante il salvataggio in Gimp?
Orschiro,

2

Uso ezgif.com/optimize , poiché GIMP e altri strumenti non sono bravi in ​​questo lavoro. La differenza è che ezgif utilizza una gifsiclemodifica (con un lossyflag), non disponibile sulla aptversione. Vedere la versione 1.82.1 qui (sostituirla /usr/bin/gifsiclecon quella appropriata per il proprio sistema (il binario termina con -static).

Le mie note su un flusso di lavoro di ottimizzazione gif completo sono qui .

Modifica : lo script corrente come in uso verrà aggiornato su GitHub qui

Non descriverò come faccio tutto qui, l'idea generale è alcune funzioni / alias 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"
}

Il --lossyflag richiede un numero intero compreso tra 30 e 200, quindi per la migliore qualità:

gifsicle -O3 --lossy=30 -o output.gif input.gif

Con la funzione sopra gifoptpuoi semplificare le cose, dato che il valore predefinito è 30

gifopt input.gif

... l'output verrebbe automaticamente nominato input-opt.gif. È possibile modificare la funzione per utilizzare il --batchflag per la modifica sul posto, ma non consiglierei di sovrascrivere il materiale di partenza.

Questa funzione funziona anche per rimuovere qualsiasi _reduced_xsuffisso aggiunto dalla funzione di riduzione del conteggio dei fotogrammi, ovvero potresti avere un file intermedio input_reduced_x2.gif(un passaggio che dimezzerebbe le dimensioni del file facendo cadere ogni altro fotogramma).

In caso contrario, la velocità potrebbe cambiare, risolta gifspeedchange input-opt.gif 5ad esempio, per utilizzare un ritardo del frame di 50 ms.


1

Puoi ottimizzare facilmente il tuo file .gif su Gimp.

Basta salvare come .gif e quindi comprimere o è possibile salvare in un'altra estensione come .jpeg o altro.


1
Come comprimi in Gimp?
Orschiro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.