Odpowiedzi:
pierwszy bieg:
convert do.gif -coalesce temporary.gif
następnie
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
też do tego
-coalesce
+ -deconstruct
Następnie -coalesce
prawdopodobnie chcesz dodać -deconstruct
:
convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
Podstawową przyczyną problemu jest prawidłowe zminimalizowanie wejściowego pliku GIF: GIF pozwala, aby następna ramka była tylko zmodyfikowanym prostokątem z poprzedniego z przesunięciem.
-coalesce
następnie rozszerza wszystkie ramki do oryginalnego rozmiaru, co powoduje zmianę rozmiaru, ale nie kompresuje ponownie ramek, ponieważ obraz wejściowy -deconstruct
jest potrzebny!
Wykorzystując dane testowe z tej odpowiedzi: Jak utworzyć animowany gif ze zdjęć (najlepiej z linii poleceń)? widzimy to wyraźnie dzięki identify
:
$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out.gif
out-coalesce.gif
out-deconstruct.gif
Po pierwsze, widzimy, jak wprowadzić plik, out-convert.gif
w rzeczywistości został skompresowany, ponieważ klatka 2 ma tylko 516x516
przesunięcie 252+257
, podczas gdy klatka 1 jest w pełnym rozmiarze 1024x1024
.
Następnie, jeśli porównamy trzy konwersje:
out.gif
: Wszystkie ramki są 256x256
większe lub większe i wynoszą około 5 Mb, TODO dlaczego?
Nieprawidłowy wizualnie, ponieważ te przybliżone 256x256
klatki mają niezerowe przesunięcie, np. 125+128
Dla klatki 2!
out-coalesce.gif
: wszystkie ramki 256x256
mają prawidłowe przesunięcie 0+0
.
Dane wyjściowe wyglądają na poprawne wizualnie, ale rozmiar pliku wyjściowego wynosi 2,0 MiB, czyli więcej niż out-deconstruct.gif
out-deconstruct.gif
: ramki skompresowane, końcowy rozmiar wyjściowy 1,9 MiB.
Nie jest znacznie mniejszy niż out-coalesce.gif
, ale myślę, że dzieje się tak tylko dlatego, że czarna ziemia bardzo dobrze się kompresuje i ogólnie może być bardzo znacząca.
ffmpeg i gifsicle
Wypróbowałem również następujące polecenia:
ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif
i oba wytworzyły jeszcze mniejszy poprawnie wyglądający wynik 1,5 MiB.
Zobacz także: Jak utworzyć animowany gif ze zdjęć (najlepiej z wiersza poleceń)?
DO ZROBIENIA: dlaczego mogą być mniejsze niż convert
? Czy po prostu wybierają lepsze, bardziej minimalne prostokąty różnicowe, czy coś innego?
Testowane w Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.
Szukałem rozwiązania imagemagick, ponieważ go znam, ale ostatecznie skorzystałem z sugestii @ sam gifsicle
. Zrobił to, co chciałem, bez kłopotów.
Mogę zoptymalizować wynikowy rozmiar pliku na wiele sposobów, ale po prostu zmniejszyłem rozmiar i liczbę kolorów. Działa jak urok:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-coalesce
„tworzy pełny widok animacji w każdym punkcie, trochę jak prawdziwy pasek filmowy, a nie sekwencję animacji. Taka sekwencja, znana jako Animacja koalescencyjna, jest o wiele łatwiejsza do studiowania, edycji, modyfikacji i ponownej optymalizacji”.