2015-06-18 9 views
5

Mam 2 GIFy o tej samej długości.ImageMagick - Tworzenie 2 GIF-ów w GIF-y przy użyciu konwertowania IM

Chcę umieścić GIFy obok siebie, aby mieć 1 GIF z obydwoma grami w tym samym czasie. Próbowałem użyć narzędzia convert z:

convert +append 1.gif1 2.gif output.gif 

to jednak wydaje się łączyć wszystkie obrazy razem i zmienia rozmiar, aby być bardzo mała.

Myślałem, że mogę dołączyć każdy obraz razem, a następnie utworzyć GIF z tych już połączonych obrazów. Jednak to nie działa, gdy próbowałem:

convert -delay 15 -loop 0 1*.png 2*.png +append output.gif 

mam dużo zdjęć z długimi nazwami i nie chcę, aby przejść przez każdy indywidualnie i dołączyć rysunek z nowymi konwencjami nazewnictwa.

Odpowiedz

14

nie mam 2 animowanych GIF-ów o tej samej długości, więc ja po prostu korzystać z dwóch kopii tego jednego:

enter image description here

Spójrzmy na ramkach w tam, z tego:

identify 1.gif 
1.gif[0] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[1] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[2] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[3] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[4] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[5] GIF 449x339 500x339+51+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[6] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[7] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[8] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[9] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[10] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[11] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[12] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[13] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[14] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[15] GIF 448x339 500x339+52+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[16] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 
1.gif[17] GIF 500x339 500x339+0+0 8-bit sRGB 32c 508KB 0.000u 0:00.000 

Mmmm, 18 klatek o różnych rozmiarach, co oznacza, że ​​musimy użyć -coalesce odbudować częściowych klatek na pełne.

Skopiujmy że i zrobić 2.gif

cp 1.gif 2.gif 

Teraz możemy rozdzielić dwa gify na poszczególne klatki, tak:

convert 1.gif -coalesce a-%04d.gif  # split frames of 1.gif into a-0001.gif, a-0002.gif etc 
convert 2.gif -coalesce b-%04d.gif  # split frames of 2.gif into b-0001.gif, b-0002.gif etc 

Teraz dołączy do poszczególnych klatek side-by-side :

for f in a-*.gif; do convert $f ${f/a/b} +append $f; done 

Pamiętaj, że ${f/a/b} to bash-ism meanin g "weź wartość f i zamień literę" a "na" b "".

i umieścić je z powrotem razem znowu:

convert -loop 0 -delay 20 a-*.gif result.gif 

To wygląda dłużej i mocniej, niż to dlatego starałem się to wszystko wyjaśnić, ale wygląda to tak naprawdę:

convert 1.gif -coalesce a-%04d.gif       # separate frames of 1.gif 
convert 2.gif -coalesce b-%04d.gif       # separate frames of 2.gif 
for f in a-*.gif; do convert $f ${f/a/b} +append $f; done # append frames side-by-side 
convert -loop 0 -delay 20 a-*.gif result.gif    # rejoin frames 

enter image description here

Należy pamiętać, że ten kod koncepcyjny, a nie jakość produkcji. Nie usuwa plików tymczasowych, które tworzy, ani nie przenosi czasu międzyramkowego z oryginalnych plików GIF.Jeśli chcesz uzyskać oryginalną liczbę klatek można dostać je w ten sposób i zapisać je do tablicy i karmić opóźnień powrotem do polecenia ponownego animacji na koniec:

identify -format "%f[%s] %T\n" 1.gif 
1.gif[0] 8 
1.gif[1] 8 
1.gif[2] 8 
1.gif[3] 8 
1.gif[4] 8 
1.gif[5] 8 
1.gif[6] 8 
1.gif[7] 8 
1.gif[8] 8 
1.gif[9] 8 
1.gif[10] 11 
1.gif[11] 11 
1.gif[12] 11 
1.gif[13] 11 
1.gif[14] 11 
1.gif[15] 11 
1.gif[16] 11 
1.gif[17] 26 

Również może chcesz przekładkę pomiędzy dwoma animacjami, powiedzmy 10 pikseli, co można zrobić, zastępując komendy convert wewnątrz pętli for z tego:

convert $f -size 10x xc:none ${f/a/b} +append $f 

enter image description here

+0

używam ImageMagick (v7.0.2) i wszystkie z polecenia działają świetnie, z wyjątkiem 'fo r f w a - *. gif; skonwertuj $ f $ {f/a/b} + dopisz $ f; done' Zgodnie z dokumentacją pętli FOR, zmieniłem ją na: 'FOR% f in (a - *. gif); DO konwersji% f% {f/a/b} + dopisz% f; gotowe, ale nadal mam kłopoty. Jakieś sugestie? Dokumentacja na temat pętli FOR, której używam, znajduje się tutaj (http://www.imagemagick.org/Usage/windows/#for_loops), a polecenie dołączania, którego używam, to: (http://www.imagemagick.org/ discourse-server/viewtopic.php? t = 11320) – AaronJPung

+1

'$ {f/a/b}' oznacza * "weź' f' i zamień wszystkie wystąpienia 'a' w nim przez' b' "* i jest specyficzne na 'bash' (w Linuksie). Aby to zrobić, musisz znaleźć sposób Windows-y. –

+0

Dzięki za potwierdzenie tego. Tak, zauważyłem różnicę w składni w stosunku do linków, które dołączyłem. Myślę, że w Windows, $ ->%. Będę na bieżąco. – AaronJPung

Powiązane problemy