Jak przekonwertować pasek PNG na GIF?

12

Tak więc stworzyłem tę animację w programie, jednak wydaje się, że nie obsługuje eksportowania jako sekwencji PNG, więc mogłem przekonwertować ją na GIF. Animacja składa się z ponad 100 klatek, więc zapisywanie każdego obrazu jeden po drugim zajmie wieki. Obsługuje jednak eksportowanie jako „pasek”, który jest jak film. Każde zdjęcie w animacji ma takie same wymiary. Oto jak działa funkcja „paska” programu.

Obrazy w animacji są ułożone poziomo, pierwsza ramka jest skrajnie lewa, a ostatnia ramka skrajnie prawa. Pomiędzy ramkami nie ma przerw, a nazwa pliku to zwykle „name_stripX.png”, jeśli animacja ma ramki X. Gdyby każda klatka miała wymiary 32 na 32, a animacja miała 8 klatek, plik ten miałby szerokość 256 i wysokość 32.

Oto kilka przykładowych wyników, każdy kolor wypełnia się w jednej ramce:

Przykładowy wynik

Ponadto, aby trochę wyjaśnić, program nazywa się „Game Maker 8.0”.

użytkownik245115
źródło

Odpowiedzi:

16

Możesz użyć ImageMagick do konwersji obrazów na różne sposoby, i powinno to być dość łatwe. Najpierw możesz podzielić na części ( original.pngbędące obrazem źródłowym, w tym przypadku o rozmiarze 32 x 32 piksele):

convert original.png -crop 32x32 parts-%02d.png

Następnie możesz przekonwertować go na animację (użyj, -loop 1jeśli nie chcesz, aby był zapętlony):

convert -loop 0 -page +0+0 ./parts*.png output.gif

Wynikające z:

Wyjściowe pliki PNG pierwszego polecenia zawierają przesunięcie, więc bez -page +0+0opcji animacja kończy się następująco:

Istnieją różne inne opcje można obejmują (głównie w drugiej komendy), takie jak -delayetc - można również zoptymalizować animację , więc jest mniejsze (i szybszy do ładowania / render) - np pożyczył od tutaj :

convert output.gif -fuzz 10% -layers Optimize optimised.gif

lub używając gifsicle

gifsicle -O output.gif -o optimised.gif

EDYCJA: Jeśli ramki są przezroczyste, możesz ustawić, aby zastąpiły ramki, dodając
-dispose Backgroundopcję, więc gdy rama jest usuwana, gdy ładowana jest następna:


Powyższy przykład wykonano bez pageopcji, więc pokazuje to wyraźnie

Problem polega na tym, że prawdopodobnie nie możesz wtedy znacznie zoptymalizować powstałego obrazu - więc innym sposobem może być uczynienie ramek nieprzezroczystymi, aby kolejna ramka obejmowała poprzednią.

Wilf
źródło
Obraz ma przezroczystość i po prostu rysuje następną klatkę nad poprzednią, czy jest jakiś sposób, aby to zrobić, aby rysowała następną klatkę na pustym miejscu?
user245115
Usunięcie przezroczystości z obrazu źródłowego jest najłatwiejszą metodą. Ale można to zrobić za pomocą większej liczby parametrów.
david6
@ user245115 - zamień ramki zamiast nakładania - patrz edycja.
Wilf