Animowane gify z okna programu

Data publikacji: 2016-10-18 | Tagi:

Od jakiegoś czasu obserwuję swego rodzaju trend w środowisku technicznym na prezentowanie przykładów działania różnych funkcji w postaci animowanych gifów. Dziś pokażę Wam jak stworzyć takie gify w miarę bezboleśnie w środowisku linuksowym.

W pierwszym kroku musimy zainstalować niezbędne oprogramowanie, na które składa się mplayer, imagemagick oraz recordmydekstop.

sudo aptitude install imagemagick mplayer gtk-recordmydesktop recordmydesktop

Po zainstalowaniu oprogramowania możemy przystąpić do pracy. Najpierw proponuję stworzyć katalog ~/animgif i uruchomić gtk-recordmydekstop. Po uruchomieniu klikamy przycisk Zapisz jako, wybieramy nasz katalog ~/animgif i podajemy nazwę pliku wyjściowego - niech to będzie out.

Uruchamiamy program, który chcemy nagrać, np. edytor, a następnie w recordmydesktop klikamy przycisk Wybierz okno i klikamy na oknie edytora. Wokół okna pojawi się czarna ramka, a na podglądzie pojawi się czerwony prostokąt.

Ostatnim krokiem nagrywania jest wciśnięcie przycisku Nagraj.

Od tego momentu całe okienko edytora jest nagrywane, a recordmydesktop zostaje zminimalizowany do małej czerwonej ikonki w pasku zadań. Kiedy zdecydujemy, że nagranie jest gotowe, wysatarczy kliknąć tą ikonkę. Program przekonwertuje wyjście i zapisze do pliku.

Plik wynikowy out.ogv znajduje się teraz w katalogu ~/animgif. Przechodzimy zatem do wygenerowania animowanego gifa:

cd ~/animgif

mplayer -ao null out.ogv -vo jpeg:outdir=output

Mplayer "odtwarza" nagrany film usuwając ścieżkę audio (-ao null), a video konwertując do jpegów, zapisując wyjście do katalogu output (-vo jpeg:outdir=output).

Wszystkie pliki jpeg konwertujemy do jednego, wyjściowego pliku gif:

convert output/* output.gif

Tak wygenerowany plik jest już pełnoprawnym animowanym gifem, ale jest trochę za duży, żeby wrzucić go np do sieci. Sprobujmy go zoptymalizować:

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

Użyliśmy flagi -fuzz 10%, dzięki której kolory różniące się od siebie o 10%, traktowane są jako jeden kolor. Użyliśmy również flagi -layers Optimize, która używa kilku technik optymalizacji pozwalających znacznie zredukować rozmiar wynikowego gifa.

U mnie roziary prezentują się następująco:

drwxr-xr-x  3 void void     4096 paź 11 18:00 .
drwxr-xr-x 85 void void     4096 paź 11 18:02 ..
-rw-r--r--  1 void void   558919 paź 11 18:00 optimised.gif
-rw-r--r--  1 void void  2808249 paź 11 07:33 out.ogv
drwxr-xr-x  2 void void    12288 paź 11 17:55 output
-rw-r--r--  1 void void 17554288 paź 11 17:56 output.gif

Sam film zajmuje okolo 3MB, gif stworzony z tego filmu zajmuje około 17.5MB, natomiast gif po optymalizacji nieco ponad 0.5MB. Wynik działania możecie zobaczyć poniżej.

Dla niecierpliwych przygotowałem skrypt łączący w sobie wszystkie te komendy:

#!/bin/sh

OUT_DIR="output"
OUT_GIF="output.gif"
OPTIMISED_GIF="optimised.gif"

echo "converting image to jpgs..."
mplayer -ao null $1 -vo jpeg:outdir=$OUT_DIR
echo "saved in ./$OUT_DIR"

echo "converting jpgs to one gif..."
convert $OUT_DIR/* $OUT_GIF
echo "saved in $OUT_GIF"

echo "optimising gif..."
convert $OUT_GIF -fuzz 10% -layers Optimize $OPTIMISED_GIF
echo "saved in $OPTIMISED_GIF"

Zapisujemy go jako make_gif.sh i wywołujemy tak:

./make_gif.sh out.ogv


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: