Jakikolwiek sposób na automatyczną kompresję pliku .gif?

11

Mam gif 2,0 MB, który chcę zmniejszyć, najlepiej przez upuszczenie niektórych ramek.

Czy istnieje narzędzie wiersza polecenia lub program, który zrobi to dla mnie automatycznie?

Dzięki.

chiba
źródło
Możesz zajrzeć do formatu webm: jest to bardziej zoptymalizowany gif!

Odpowiedzi:

8

ImageOptim używa Gifsicle do kompresji Gif. O ile mi wiadomo, działa całkiem dobrze (obecnie nie używam Gif). Z ich strony:

Zoptymalizuj swoje animacje! Przechowuje tylko zmienioną część każdej ramki i może radykalnie zmniejszyć pliki GIF. Możesz także użyć przezroczystości, aby je jeszcze zmniejszyć. Optymalizator Gifsicle jest dość potężny i zwykle redukuje animacje do kilku bajtów najlepszych komercyjnych optymalizatorów.

Shauna
źródło
6

Możesz użyć Gimpa,Zainstaluj gimp aby usunąć niektóre ramki z GIF-a, a także ponownie zoptymalizować plik, zapisując go z powrotem do GIF-a.

MrMassiveManMeat
źródło
Jak ponownie zoptymalizować plik po zapisaniu w Gimp?
orschiro
2

Używam ezgif.com/optimize , ponieważ GIMP i inne narzędzia nie są dobre w tym zadaniu. Różnica polega na tym, że ezgif używa gifsiclemodyfikacji (z lossyflagą), niedostępnej w aptwersji. Zobacz wersję 1.82.1 tutaj (zamień /usr/bin/gifsiclena odpowiednią dla twojego systemu (binarne kończące się na -static).

Moje notatki na temat pełnego procesu optymalizacji gif są tutaj .

Edycja : bieżący skrypt pozostający w użyciu zostanie zaktualizowany na GitHub tutaj

Nie opiszę tutaj, jak to wszystko robię, ogólną ideą jest kilka funkcji / aliasów 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"
}

--lossyFlag bierze całkowitą od 30 do 200, więc dla uzyskania najlepszej jakości:

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

Dzięki powyższej funkcji gifoptmożesz uprościć sprawy, ponieważ domyślnie jest to 30

gifopt input.gif

... wyjście zostanie automatycznie nazwane input-opt.gif. Możesz zmienić funkcję, aby używać --batchflagi do edycji w miejscu, ale nie polecam zastępowania materiału początkowego.

Ta funkcja działa również w celu usunięcia _reduced_xprzyrostka dodanego przez funkcję zmniejszania liczby klatek, tzn. Możesz mieć plik pośredni input_reduced_x2.gif(krok, który zmniejszyłby rozmiar pliku o połowę poprzez usunięcie każdej innej ramki).

Jeśli to zrobisz, prędkość może się zmienić, gifspeedchange input-opt.gif 5np. Ustawić opóźnienie ramki 50 ms.

Louis Maddox
źródło
1

Możesz łatwo zoptymalizować plik .gif w Gimp.

Po prostu Zapisz jako .gif, a następnie skompresuj lub możesz zapisać w innym rozszerzeniu jako .jpeg lub inny.

Jorge Pinho
źródło
1
Jak kompresujesz w Gimp?
orschiro