Gibt es eine Möglichkeit, eine GIF-Datei automatisch zu komprimieren?

11

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.

Chiba
quelle
Vielleicht möchten Sie sich das WebM-Format ansehen: Es ist wie ein optimiertes GIF!

Antworten:

8

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.

Shauna
quelle
6

Mit dem Gimp können Sie Installieren Sie Gimpeinige Frames aus dem GIF entfernen und die Datei erneut optimieren, indem Sie sie erneut in einem GIF speichern.

MrMassiveManMeat
quelle
Wie optimieren Sie die Datei beim Speichern in Gimp neu?
Orschiro
2

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 lossyFlag) verwendet, die in der aptVersion nicht verfügbar ist . Siehe Release 1.82.1 hier (ersetzen Sie es /usr/bin/gifsicledurch 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 --lossyFlag 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 gifoptSie 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 --batchFlag für die direkte Bearbeitung zu verwenden, aber ich würde nicht empfehlen, Ihr Ausgangsmaterial zu überschreiben.

Diese Funktion entfernt auch alle _reduced_xSuffixe, 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 5z. B. um eine Bildverzögerung von 50 ms zu verwenden.

Louis Maddox
quelle
1

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.

Jorge Pinho
quelle
1
Wie komprimiert man in Gimp?
Orschiro