Odpowiedzi:
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.
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 gifsicle
modyfikacji (z lossy
flagą), niedostępnej w apt
wersji. Zobacz wersję 1.82.1 tutaj (zamień /usr/bin/gifsicle
na 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"
}
--lossy
Flag 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 gifopt
moż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ć --batch
flagi do edycji w miejscu, ale nie polecam zastępowania materiału początkowego.
Ta funkcja działa również w celu usunięcia _reduced_x
przyrostka 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 5
np. Ustawić opóźnienie ramki 50 ms.
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.