Jak mogę zmienić rozmiar animowanego pliku GIF za pomocą ImageMagick?

46

Chcę zmienić rozmiar takiego animowanego pliku GIF do.gif wprowadź opis zdjęcia tutaj

Jeśli to zrobię convert do.gif -resize 24x24\! do-24.gif, rozmiar zostanie zmieniony w do-24.gif, ale nie jest animowanywprowadź opis zdjęcia tutaj

Jak zmienić rozmiar we właściwy sposób, aby uzyskać tę samą animację?

Zuba
źródło

Odpowiedzi:

56

pierwszy bieg:

convert do.gif -coalesce temporary.gif

następnie

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
fipsalabim
źródło
2
-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”.
sam
28
gifsicle --resize 24x24 > do-24.gifteż do tego
sam
2
Zauważ, że widok koalescencyjny jest znacznie większy niż widok zoptymalizowany (3,2 razy w moim teście), a zmiana rozmiaru powoduje powstanie koalescencyjnego obrazu, który może być również większy niż rozmiar oryginału (2,3 razy w moim teście), nawet jeśli rozdzielczość jest mniejszy. Kiedy próbuję zmienić rozmiar bezpośrednio, wygląda dobrze i ma mały rozmiar pliku, chociaż może po prostu działa dla tego obrazu.
endolith
1
gifsicle wyprodukował znacznie lepszą, zoptymalizowaną wydajność dla mojego przypadku użycia. Dzięki @sam!
sj26
4
konwersja tymczasowa.gif - rozmiar 24x24 mniejszy.gif działa dla mnie., bez określania wielkości wejściowej.
AMB
3

-coalesce + -deconstruct

Następnie -coalesceprawdopodobnie 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.

-coalescenastępnie rozszerza wszystkie ramki do oryginalnego rozmiaru, co powoduje zmianę rozmiaru, ale nie kompresuje ponownie ramek, ponieważ obraz wejściowy -deconstructjest 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

wprowadź opis zdjęcia tutaj

out-coalesce.gif

wprowadź opis zdjęcia tutaj

out-deconstruct.gif

wprowadź opis zdjęcia tutaj

Po pierwsze, widzimy, jak wprowadzić plik, out-convert.gifw rzeczywistości został skompresowany, ponieważ klatka 2 ma tylko 516x516przesunię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ą 256x256większe lub większe i wynoszą około 5 Mb, TODO dlaczego?

    Nieprawidłowy wizualnie, ponieważ te przybliżone 256x256klatki mają niezerowe przesunięcie, np. 125+128Dla klatki 2!

  • out-coalesce.gif: wszystkie ramki 256x256mają 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.

Ciro Santilli
źródło
3

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
Peter Perháč
źródło