it-swarm.com.de

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

Ich habe ein GIF von 2,0 MB, das ich verkleinern möchte, vorzugsweise durch Löschen einiger Frames.

Gibt es ein Befehlszeilenprogramm oder ein Programm, das dies automatisch für mich erledigt?

Vielen Dank.

11
chiba

ImageOptim verwendet Gifsicle für die Gif-Komprimierung. Soweit ich weiß, funktioniert es recht gut (ich verwende derzeit im Allgemeinen kein Gif). Von ihrer Website:

Optimieren Sie Ihre Animationen! Dies speichert nur den geänderten Teil jedes Frames und kann Ihre GIFs radikal verkleinern. Sie können auch Transparenz verwenden, um sie noch kleiner zu machen. Der Optimierer von Gifsicle ist ziemlich leistungsfähig und reduziert Animationen in der Regel auf wenige Bytes der besten kommerziellen Optimierer.

8
Shauna

Sie können die GimpeInstall gimp um einige Frames aus dem GIF zu entfernen und die Datei neu zu optimieren, indem Sie sie wieder in einem GIF speichern.

6

Ich benutze ezgif.com/optimize , da GIMP und andere Tools bei diesem Job nicht gut sind. Der Unterschied besteht darin, dass ezgif eine Modifikation gifsicle (mit dem Flag lossy) verwendet, die in der Version apt nicht verfügbar ist. Siehe Release 1.82.1 hier (Ersetzen Sie /usr/bin/gifsicle durch den für Ihr System geeigneten (die binäre Endung mit -static).

Meine Notizen zu einem vollständigen GIF-Optimierungsworkflow lauten hier .

Bearbeiten : Das aktuell verwendete Skript wird auf GitHub aktualisiert 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 ganze Zahl 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 gifopt könnten Sie die Sache vereinfachen, da sie standardmäßig 30 ist

gifopt input.gif

... die Ausgabe würde automatisch input-opt.gif heißen. Sie könnten 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 Funktion zur Reduzierung der Bildanzahl hinzugefügt wurden, d. H. Sie könnten eine Zwischendatei input_reduced_x2.gif haben (ein Schritt, der die Dateigröße halbiert, indem jeder andere Frame gelöscht wird).

In diesem Fall kann sich die Geschwindigkeit ändern, z. B. mit gifspeedchange input-opt.gif 5 festgelegt, um eine Frame-Verzögerung von 50 ms zu verwenden.

2
Louis Maddox

Sie können Ihre GIF-Datei auf Gimp einfach optimieren.

Einfach als .gif speichern und dann komprimieren oder in anderer Endung als .jpeg oder anderes speichern.

1
Jorge Pinho