Ich habe ein 2,0-MB-GIF, das ich verkleinern möchte, vorzugsweise durch Ablegen einiger Frames.
Gibt es ein Befehlszeilenprogramm oder ein Programm, das dies automatisch für mich erledigt?
Vielen Dank.
Ich habe ein 2,0-MB-GIF, das ich verkleinern möchte, vorzugsweise durch Ablegen einiger Frames.
Gibt es ein Befehlszeilenprogramm oder ein Programm, das dies automatisch für mich erledigt?
Vielen Dank.
Antworten:
ImageOptim verwendet Gifsicle für die Gif-Komprimierung. Soweit ich weiß, funktioniert es recht gut (ich benutze Gif heutzutage im Allgemeinen nicht). Von ihrer Website:
Optimieren Sie Ihre Animationen! Dadurch wird nur der geänderte Teil jedes Frames gespeichert und Ihre GIFs können radikal verkleinert werden. Sie können Transparenz auch verwenden, um sie noch kleiner zu machen. Der Optimierer von Gifsicle ist ziemlich leistungsfähig und reduziert Animationen normalerweise auf wenige Bytes der besten kommerziellen Optimierer.
Ich benutze ezgif.com/optimize , da GIMP und andere Tools in diesem Job nicht gut sind. Der Unterschied besteht darin, dass ezgif eine gifsicle
Änderung (mit einem lossy
Flag) verwendet, die in der apt
Version nicht verfügbar ist . Siehe Release 1.82.1 hier (ersetzen Sie es /usr/bin/gifsicle
durch das für Ihr System geeignete (die binäre Endung mit -static
).
Meine Notizen zu einem vollständigen Workflow zur GIF-Optimierung finden Sie hier .
Bearbeiten : aktuelle Skript als in Gebrauch gehalten wird auf GitHub aktualisiert werden hier
Ich werde hier nicht beschreiben, wie ich das alles mache. Die allgemeine Idee sind ein paar Bash-Funktionen / Aliase:
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"
}
Das --lossy
Flag nimmt eine Ganzzahl von 30 bis 200 an, um die beste Qualität zu erzielen:
gifsicle -O3 --lossy=30 -o output.gif input.gif
Mit der obigen Funktion können gifopt
Sie die Dinge vereinfachen, da standardmäßig 30 verwendet wird
gifopt input.gif
... würde die Ausgabe automatisch benannt input-opt.gif
. Sie können die Funktion ändern, um das --batch
Flag für die direkte Bearbeitung zu verwenden, aber ich würde nicht empfehlen, Ihr Ausgangsmaterial zu überschreiben.
Diese Funktion entfernt auch alle _reduced_x
Suffixe, die durch die Frame-Count-Reduction-Funktion hinzugefügt wurden, dh Sie könnten eine Zwischendatei haben input_reduced_x2.gif
(ein Schritt, der die Dateigröße halbiert, indem jeder zweite Frame gelöscht wird).
Wenn Sie dies getan haben, kann sich die Geschwindigkeit ändern, gifspeedchange input-opt.gif 5
z. B. um eine Bildverzögerung von 50 ms zu verwenden.
Sie können Ihre GIF-Datei auf Gimp einfach optimieren.
Speichern Sie einfach als .gif und komprimieren Sie dann oder Sie können in einer anderen Erweiterung als .jpeg oder eine andere speichern.