Risposte:
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.
Uso ezgif.com/optimize , poiché GIMP e altri strumenti non sono bravi in questo lavoro. La differenza è che ezgif utilizza una gifsicle
modifica (con un lossy
flag), non disponibile sulla apt
versione. Vedere la versione 1.82.1 qui (sostituirla /usr/bin/gifsicle
con 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 --lossy
flag 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 gifopt
puoi 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 --batch
flag per la modifica sul posto, ma non consiglierei di sovrascrivere il materiale di partenza.
Questa funzione funziona anche per rimuovere qualsiasi _reduced_x
suffisso 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 5
ad esempio, per utilizzare un ritardo del frame di 50 ms.
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.