Hlavní navigace

GAP, aneb animování v GIMPu

29. 10. 1999
Doba čtení: 16 minut

Sdílet

GIMP 1.2 sice ještě není venku, ale to mění pramálo na tom, abyste s ním uměli animovat ještě před tím, než se tak stane (mělo by to být do konce roku. Pro nedočkavce silně doporučuji zkusit vývojovou verzi, od verze 1.0.X se liší jako BMW z3 coupe od trabanta). Nechť vám ROOT zaplácne GAP** ve vašich znalostech o animování v GIMPu.
Formáty animace

Prostředí WWW bylo od počátku koncipováno jako prostředí multimediální. Nikoli pouze text, ale i obrazová informace je pro člověka důležitá. Jak je to ale s datově náročnou animací, tedy sledu statických snímků jež naše oko zmate natolik že jej mozek rozezná jako pohyb?

V prostředí WWW existuje jen několik málo formátů vhodných pro animace. Mnoho platforem preferuje vlastní formát, na platformě MS Windows je pravděpodobně nejčastěji používaným formátem avi, v prostředí /pple Macintosh zase Apple Quicktime. Bohužel oba tyto formáty jsou pouze zastřešující formát pro specifické způsoby komprese (codecs), naopak jako raw stream bez komprese jsou tyto formáty nepoužitelné. Výsledkem je nízká přenositelnost těchto formátů a použitelnost v globálním měřítku.

Daleko lepší je to s formátem mpeg. I když se nejedná o free standard, neexistuje pravděpodobně platforma, která by si s tímto formátem neporadila a navíc existuje mnoho softwaru pro ukládání animace do tohoto formátu. V prostředí Unix je asi nejpopulárnější knihovna mpeg_lib, původně vyvinutá na univerzitě v Berkeley.

Právě tuto knihovnu umí GIMP využívat, takže v případě potřeby, budete moci svoje GIMP animace ukládat mj. i do tohoto formátu.

Není animace jako animace

Animace jako sled statických snímků s konstantním zpožděním, tedy délkou zobrazení obvykle definovanou spíše číslem udávajícím počet snímků zobrazených v časové jednotce (fps – frames per second), je příliš náročná na objem přenášených dat.

I kdybyste chtěli takto velké animace umístit přímo do HTML dokumentu, použití formátu mpeg je v tomto případu víceméně neakceptovatelné. Podpora přehrávání mpeg animací není až na vyjímky součástí jádra WWW prohlížečů a je případně řešeno pomocí zásuvného modulu. Jinými slovy, nemáte příliš velkou pravděpodobnost, že animaci shlédne větší procento návštěvníků vašich stránek. Mnoho uživatelů sice uvítá možnost obohatit svůj prohlížeč o další funkci, ale většinu tento proces ``stažení'' zásuvného modulu bude spíše otravovat.

Už nějaký ten pátek ale existuje formát bitmapy GIF, který od verze 89a podporuje i jednoduché animace. Animace jsou navíc lepší pro prostředí WWW z toho důvodu, že umožňují specifikovat délku trvání snímku, použít pro animaci pouze část podkladového obrázku a to vše kombinovat s možností nastavit jednu barvu palety jako „průhlednou“.

Použití tohoto formátu je ale velice kontroverzní. Formát byl společně s obrázky JPEG vzat za ``vlastní'' pro službu WWW. Bohužel společnost Unisys, vlastní patent na LZW kompresi v rámci tohoto formátu a za jeho použití začala až zpětně vyžadovat provizi. Existuje sice statická alternativa v podobě formátu PNG, ale jeho implementace v prohlížečích je teprve v začátcích (o plné implementaci se dá hovořit až od verze 5 obou nejvíce používaných prohlížečů – Netscape Navigator, MS Internet Explorer). Hovoříme-li o animacích, zmiňuje se často jako alternativa ke GIFu formát MNG. Jeho specifikace vypadá velice slibně, ale bohužel implementace tohoto formátu je teprve v plenkách.

V současnosti tedy spíše alternativa neexistuje, do budoucna se to doufám s příchodem nových prohlížečů zlepší. Potom pravděpodobně Unisys stejně svoje podmínky zmírní, to už ale bude pozdě a formát GIF opustí oblast široce podporovaných formátů.

Jednoduché animace

Přímo do jádra GIMPu zakomponovali autoři možnost animovat. Práce s animací spočívá v rozložení animace na jednotlivé snímky. Každý snímek zabírá v aktuálním obrázku jednu vrstvu. Parametry jako délka trvání snímku, způsob obnovení obrazu apod. je možné specifikovat jako parametr v titulku vrstvy.

Pakliže již ovládáte práci s vrstvami, zvládáte jednoduché animace s GIMPem. Při tvorbě animace máte dvě možnosti, buď necháte nový snímek přepsat snímek minulý (replace), nebo nový snímek ``přidat'' ke snímku předchozímu (combine). Oba způsoby definujeme přímo v komentáři vrstvy jako dobu trvání snímku.

Tento klasický způsob se hodí zejména pro ruční animování. Máte možnost nejenom zobrazit aktuální snímek, ale pomocí změny průhlednosti vrstev vidět třeba i snímek předchozí/nás­ledující a tak zabezpečit plynulost vaší animace.

jednoduchá animace

Z vlastní zkušenosti ale musím konstatovat že i na první pohled jednoduché animace s postupným zobrazováním jinak statických objektů je lepší řešit pomocí GAP (viz dále).

Než se ale vnoříme do komplexnějšího světa GAP, prohlédneme si ještě krátce co se skrývá za menu <obrázek>/fil­try/animation (překlad GIMPu zatím není příliš kompletní, takže podobných anglicko-českých kombinací si zatím ještě užijete relativně dostatek). Webdesigner ocení hlavně funkci animation optimize, která přefiltruje všechny vrstvy a ořeže je podle vizuální změny po jednotlivých snímcích. V podstatě je to inteligentní filtr, který místo metody replace používá výše zmíněný combine, takže aktualizuje pouze části obrazu ve kterých došlo oproti předchozímu snímku ke změně. Výsledek je soubor zabírající daleko méně místa na disku, hodící se pro formát GIF (Zatím GIMP bohužel nepodporuje formát MNG, do budoucna se alespoň máme na co těšit). Někdy se budete pravděpodobně chtít vrátit k animaci před použitím tohoto filtru (předpokládám že jste obrázek už zavřeli, nebo se dostali za pásmo nastavených úrovní undo). Právě k tomu slouží filtr animation unoptimize. Ten převede vrstvy zase do úplných snímků a módu replace.

metoda combine

Před tím, než se vrhneme na komplexnější animace, prozkoumáme ještě krátce další filtry z položky animation. Tím zajímavějším je filter all layers. Ačkoli se nachází mezi animačními filtry, dá se veskrze úspěšně používat i na statické obrázky. Principiálně se jedná o plugin, který volá vámi vybraný filtr a aplikuje ho na všechny vrstvy aktuálního obrázku. Ovšem jeho hlavní výhodou je možnost aplikovat filtr s různým nastavením pro první a poslední vrstvu. Filtr pak interpoluje nastavení pro ostatní vrstvy. Efekty jako zaostření obrazu jdou díky tomuto filtru replikovat velice snadno pomocí filtru gaussian blur. Stačí jako první parametry nastavit vysokou hodnotu rozostření a jako poslední/druhou volbu rozostření žádné. Výsledek mě samotného překvapil. Bohužel ne všechny filtry mají v době psaní tohoto textu (musím si nechat zadní vrátka, co platí dnes, nemusí platit zítra) i neinteraktivní mód, takže apply varying nefunguje. Sám bych si rád ozkoušel pohyb textury, nebo bumpmapy ve Sphere Designer.

filter all layers

Abychom si použití tohoto filtru ukázali názorně, zkusíme zaostřit nějaké logo. Abych zabil dvě mouchy jednou ranou, použiji v tomto tutoriálu logo manažeru oken, Enlightenment, jemuž musím trochu pomoci vytvořením reklamního proužku (ne že bych takového molocha osobně používal ;).

  1. Vytvořte/nahrajte kýžené logo.
  2. Nyní musíme jedinou vrstvu, která se v obrázku nachází zkopírovat tolikrát, kolik chceme aby naše budoucí animace měla snímků. Dejme tomu, že budeme chtít animaci s 10 snímky. Toho docílíme nám již známým duplicate layer (Ctrl+C v okně vrstvy). Před kopírováním se ubezpečte, že pro kopírovanou vrstvu máte vypnuté nastavení ``keep transparency/zacho­vat krytí''.
  3. Nyní můžeme aplikovat vlastní filter all layers. Ze seznamu aplikovatelných filtrů vyberte plug-in-gauss-rle a zvolte apply varying.
  4. První dialog se týká spodní vrstvy, tedy prvního snímku. Jelikož chceme vytvořit efekt horizontálního zaostření, necháme vrstvu rozostřit pouze podle osy X.
  5. Po potvrzení prvního dialogu se nás filter all layers zeptá, jestli chceme nastavit i parametry poslední vrstvy. Po zvolení continue tak můžeme učinit. Jelikož na poslední vrstvě chceme mít ostrý obraz, nastavíme míru rozostření na 0.
  6. Nyní nastavíme poslední vrstvě délku trvání na 4 sekundy tak, že do komentáře vrstvy (dvojklepnutí v okně vrstev) připíšeme na konec v závorce 4000ms.

Teď si již animaci můžeme prohlédnout. Jelikož však GIMP v tuto chvíli neví, jaká je implicitní délka trvání snímku, musíme ji buď definovat v komentáři, což je v tuto chvíli zbytečné a zdlouhavé, nebo ji nastavit při ukládání do formátu GIF. Kdybychom byli prozíravější, mohli jsme délku trvání definovat před duplikováním vrstvy. Tak by se kromě vrstvy zkopíroval i komentář.

filter all layers

Pokročilé animace

Jak jsem se již zmínil, animace po jednotlivých vrstvách se spíše hodí pro ruční animátorskou dřinu, nikoli pro běžně potřebné rozpohybování třeba takového reklamního proužku, banneru.

Jak ale zabezpečit možnost pracovat s vrstvenými obrázky a zároveň mít z těchto obrázků animaci? Odpovědí na tuto otázkou je GAP: GIMP Animation Package/Plugins. Na první pohled je práce s tímto balíkem dost neintuitivní. Později zjistíte, že práce s tímto balíkem je skutečně neintuitivní. Ale zvyknout se dá na vše a uvidíte, že s trochou píle budete schopni vytvářet poměrně komplexní animace.

Jádrem celého balíku je filtr move path. Ač by se z názvu dalo vypozorovat, že se jedná o nástroj pro hýbání sprajty, ve skutečnosti se za tímto nástrojem skrývá daleko víc než pohyb. Nejprve budete možná zaskočeni množstvím voleb, ale po chvíli užívání si budete přát těch nastavení mít ještě krapet víc.

Před praktickou ukázkou práce s GAP si popíšeme tento klíčový nástroj. Dialogové okno move path je vcelku přehledně uspořádáno tak, jak ukazuje obrázek.

move path

  1. SourceImage/Layer = zdrojová vrstva/obrázek – objekt se kterým chcete pomocí move path manipulovat. Podle nastavené metody (2) budete pracovat buď s jedinou vrstvou, nebo celým výběrem vrstev.
  2. Stepmode = způsob vkládání sekvence – pakliže je objektem (1) obrázek s jedinou vrstvou, nemusí vás toto nastavení příliš trápit, neboť výsledek bude vždy stejný. Smysl má toto nastavení u vícevrstevných obrázků. Nastavení loop znamená cyklení vrstev v rámci zdrojového obrázku. Když máte ve zdrojovém obrázku, řekněme tři vrstvy, a výsledná move animace má 15 snímků, budou tyto tři vrstvy cyklovány celkem pětkrát. Loop reverse činí totéž, tentokrát v opačném pořadí (shora dolů v layer stack). Once provede animaci v rámci vrstevného obrázku pouze jednou a zbylé snímky zaplní poslední vrstvou ze zdrojového obrázku, once reverse totéž v opačném směru. PingPong je speciálním typem smyčky, která po dospění poslední vrstvy nepokračuje opět od první vrstvy, nýbrž se v opačném směru vrací. Poslední možností je volba none, která se hodí v případech, kdy budete chtít do své animace vložit pouze jednu vrstvu z vybraného vícevrstevného zdrojového obrázku.
  3. Mode = způsob aplikace nové vrstvy – stejně jako u každé vrstvy i zde máte možnost nastavit, jak má nová vrstva ovlivnit vrstvy pod ní.
  4. Handle = centrování – v náhledu uprostřed dialogu můžete buď interaktivně, nebo pomocí dialogu (5) nastavit pozicování zdrojové vrstvy. Handle definuje co uvedené souřadnice popisují – left top/ levý horní roh vložené vrstvy apod.
  5. X,Y = pozice – společně s tzv. animačním bodem (keypoint) tvoří tyto dvě vstupní položky základ animace pohybu zdrojové vrstvy po obrázku. Při interaktivním zadávání pozice na náhledu jsou tyto položky automaticky vyplněny na základě aktuální pozice kurzoru na náhledu.
  6. Width, height = šířka, výška – nejenom že můžete s objektem pohybovat, můžete ho v čase i deformovat co do velikosti. Efekty jako zoom docílíte právě těmito dvěma volbami.
  7. Opacity = průhlednost – další vlastností, kterou můžete animovat v čase, je průhlednost zdrojové vrstvy. Takto získáte třeba tzv. fade-in, fade-out efekt.
  8. Rotate = rotovat – další základní pohybovou vlastností je rotace objektu.
  9. Start Frame = počáteční snímek – GAP pracuje lineárně, takže nelineární přechody mezi dvěma uzly (keypoints) je třeba řešit rozdělením na dva nebo více lineárních segmentů. Osobně dávám přednost duplikování snímku postupně (viz dále), než rozdělení celkové animace do částí, jestliže však preferujete druhou variantu, tento posuvník budete používat pro definici začátku segmentu animace.
  10. End Frame = konečný uzel – analogicky end frame definuje konec segmentu animace.
  11. Preview Frame = snímek pro zobrazení náhledu – zobrazí podkladový snímek který si vyberete. Hodí se například v případech, kdy chcete aby nová animace ``sedla'' a tak můžete přesněji pozicovat nový klíč. Na výsledek animace nebude mít tato volba žádný dopad.
  12. Layer stack = umístění vrstvy – ne vždy si budete novou vrstvu umístit navrch těch existujících. Právě k tomu slouží tato volba. Implicitní nastavení 0 je právě vrchol zásobníku vrstev, se zvyšujícím číslem klesá zdrojová vrstva dospod.

Základem práce v GAP je pochopení principu, že pracujete s množstvím vrstvených XCF bitmap a můžete je editovat buď individuálně (hodí se například při práci s textem), nebo pomocí funkcí GAP. Nejlépe si ale vše předvedeme na příkladu. Nejtypičtějším případem použití animací je pro webdesignera tvorba tzv. bannerů, tj. reklamních proužků.

  1. Prvním krokem při tvorbě animace je příprava. GAP neobsahuje možnost jednoduchého ``undo'', takže přísloví dvakrát měř, jednou řež je v případě komplexnějších animací dvakrát pravdivé. Ukážeme si, že ne každý ``přehmat'' bude pro naši animaci fatální. Osobně doporučuji nejprve si rozmyslet jak bychom banner koncipovali jako statický a teprve potom se ho snažili rozpohybovat. Standardní velikost banneru je 468×60. Po krátkém experimentování jsem dospěl k návrhu jež vidíte na obrázku.

    move path

  2. Místo v levé části obrázku je vyhrazeno pro vlastní animaci. V té využijeme možnosti které nám skýtá jak GAP, tak i standardní animační filtry. V této chvíli se nepozastavujte nad vkusností vybraných přechodů, snažil jsem se na tomto příkladu ukázat co nejvíce funkcí GAP a technik je využívající. V reálné situaci bych zvolil patrně pouze jeden přechodový efekt. Prvním efektem, který použijeme bude již zmíněný fade-in. K tomu nám postačí jednoduchý text v novém obrázku. Vytvořte tedy nový obrázek s transparentním pozadím a pomocí nástroje pro tvorbu textu vytvořte jednoduchý a hlavně dostatečně malý text.
  3. Náš banner ze kroku 1 nyní musíme uložit do formátu, kterému GAP rozumí, tedy název_0001.xcf. Nyní máme první snímek naší animace. Tento snímek nyní musíme čtyřikrát zkopírovat, abychom efektu umožnili vyniknout alespoň na pěti snímcích animace. Toho můžeme dosáhnout ručním ukládáním do souborů s názvy s rostoucím pořadovým číslem, nebo spíše použitím funkce GAP: <obrázek>/Anim­Frames/Duplica­te Frames.
  4. Nyní můžeme přistoupit k vlastnímu použití filtru Move Path, nacházejícího se taktéž mezi položkami AnimFrames. Jako zdroj vyberte obrázek s textem. Nastavení způsobu opakování v tuto chvíli není podstatný, protože máme jedinou vrstvu. Jako způsob překreslení nechejte implicitní Normal. K nejlepšímu vycentrování se nám bude hodit nastavení Handle=center. Nyní v náhledu klepněte na střed volné oblasti na banneru. X, Y souřadnice tohoto bodu si buď zapamatujte, nebo použijte možnost uložit jednotlivá nastavení keypoints: save points. V příštím přechodu pak nebudete muset všechna nastavení volit znovu, nýbrž je nejdřív nahrajete pomocí load points a následně upravíte na nový efekt.
  5. Všimněte si, že nastavení ve střední části dialogu jsou označeny číslicí ve hranatých závorkách. Tato nastavení se totiž týkají jednoho snímku (keypoint). Pro animaci budete potřebovat většinou více než jeden keypoint. Další keypoint přidáte pomocí add point. Pohyb na následující keypoint provedete přes next point, zpátky se dostanete pomocí prev point. Číslo v závorce ukazuje, jak jste se jistě již dovtípili, pořadové číslo klíčového snímku. Před tím, než vytvoříme druhý keypoint nastavte ještě průhlednost (opacity) na 0%.
  6. Po vytvoření nového bodu mají všechna nastavení označení [2]. Teď můžete průhlednost nastavit na 100%. Tím je vlastně animace hotova. GIMP za vás dointerpoluje všechny snímky mezi těmito dvěma průhlednostními nastaveními. V tomto případě se jedná pouze o tři snímky, ale mohly by to být klidně stovky snímků.
  7. Nyní stačí aplikovat nastavení tlačítkem OK. Výslednou animaci můžete prohlížet pomocí funkcí AnimFrames/Goto Next a Animframes/Goto Prev. Je výhodné nastavit těmto funkcím klávesovou zkratku, já například používám Alt+> a Alt+<. Kdybychom skončili s animováním, mohli bychom výslednou animaci převést do standardní formy obrázku s vrstvami znázorňujícími jednotlivé snímky animace pomocí funkce AnimFrames/Frames to Image. My ale s animováním nekončíme, takže poslední snímek zkopírujeme nejdříve jednou pomocí již známé funkce Duplicate Frame. Přesuneme se na poslední snímek pomocí Goto Next, nebo Goto Last. V tomto snímku smažeme vrstvu textu a čtyřikrát zkopírujeme pomocí Duplicate Frames.
  8. Tuto další pětisnímkovou sekvenci vyplníme efektem reverse zoom. Opět si budeme muset vytvořit textovou zprávu v okně. Abychom zachovali určitý styl, vytvoříme novou vrstvu do obrázku s textem použitým pro první efekt. Opět vyvoláme na obrázku banneru Move Path dialog.
  9. Pakliže jsme si minulé nastavení klíčových bodů uložili pomocí save points, můžeme si vše nahrát pomocí load points. V opačném případě musíme nastavení zadat opět ručně. Nyní již ve zdrojovém obrázku máme více vrstev. Chceme ovšem pouze nově vytvořenou vrstvu, takže ve stepmode vybereme položku None. Zoom efekt bude spočívat ve zmenšení nápisu z dvojnásobné velikosti na původní, čímž vznikne efekt, jako kdyby text přilétl od pozorovatele na plochu banneru. Na prvním keyframe tedy nastavíme Width a Height na 200%. Na druhém pak 100%. Animaci necháme vypočítat potvrzením tlačítkem OK (Jako doplňkový efekt můžete přidat efekt průhlednosti, jak jsme si jej ukázali v předchozím segmentu animace).
  10. I tento efekt nám ale nestačí, takže pomocí stejného postupu přidejte dalších 5 ``prázdných'' snímků banneru. K tomuto efektu použijeme nejenom funkce GAP, ale i filtru filter all layers a jednoduchých animačních schopností GIMPu.
  11. Nyní vytvoříme jednoduchý efekt mozaikového zaostření. Vytvoříme obrázek s vrstvou textu, kterou čtyřikrát zkopírujeme s vypnutým nastavením keep transparency/ zachovat krytí.
  12. Nyní aplikujeme na všechny vrstvy přes filter/animati­on/filter all layers filtr pixelize. Po vybrání apply varying vyberte pro spodní vrstvu velkou šířku pixelu, řekněme 25 pixelů. Pro poslední naopak jeden pixel. Ne všechny filtry umožní podobné nastavení, kdy výsledkem použití filtru je nezměněný originál (například gaussian blur o 0px je ve skutečnosti blur o 1px). V takových případech se hodí DnD vlastnost GIMPu, která vám umožní vytvoření nového obrázku z aktuální vrstvy pomocí přetáhnutí vrstvy z layer stack na toolbar. Po aplikaci filter all layers tuto originální vrstvu opět přesuňte na své místo v layer stack.

    move path

    Nyní je jednoduchá animace připravena. Teď ji zakomponujeme do našeho banneru pomocí Move Path. Jako stepmode zadejte buď Loop nebo Once, výsledek bude stejný neboť počet snímků v banner animaci je shodný s počtem snímků naší textové animace. Kdybychom chtěli efekt doplnit opětovným rozmazáním po zaostření, stačilo by počet prázdných snímků v banner animaci zvýšit na dvojnásobek snímků animace textu a jako stepmode nastavit PingPong. Pozor! Jako první snímek vyberte spodní vrstvu textového obrázku. Před Move path nezapomeňte nastavit viditelnost na všech vrstvách textového obrázku, ušetříte si pak zbytečné nastavování viditelnosti ve finální animaci.

  13. Co ale teď s finálním bannerem? Nebýt to banner, ale plynulá animace, mohli bychom výsledek uložit do formátu mpeg1 nebo mpeg2. Před vlastním Frames mpegX encode bychom museli animaci převést na .ppm formát pomocí Frames convert. Jelikož ale chceme nastavit délku trvání některých snímků na delší časový úsek než zbytek a navíc chceme banner umístit přímo do WWW stránky, musíme animaci uložit do formátu GIF (bohužel nemáme na výběr). Nejprve animaci převedeme na obrázek s vrstvami, specifikujícími jednotlivé snímky animace přes AnimFrames/Frames to Image. Dialogové okno nám umožňuje vybrat jaký segment animace chceme převést, jak pojmenovat cílové snímky/vrstvy a další volby jako vynechání podkladu nebo přeuspořádání vrstev před exportem.
  14. Před uložením ještě obrázek zoptimalizujeme pomocí filter/animati­on/animation optimize a u snímků se zaostřeným textem (tedy vrstvy 5, 10 a 15) nastavíme prodlevu na 3 sekundy tak, že do názvu vrstvy přidáme text (3000ms). Pro zapomětlivé připomenu, že komentář editujeme dvojklepnutím na název vrstvy v layer stack. Nyní převedeme banner na indexové barvy abychom byli schopni uložit banner do formátu GIF. Prodlevu ostatních snímků nebudeme nastavovat manuálně po jedné, nýbrž použijeme volbu delay between frames where unspecified v dialogu save as GIF. V souvislosti s trváním jednotlivých snímků se musím pozastavit nad časovačem prohlížečů pod MS Windows. V tomto prostředí jsou všechny GIF animace velmi pomalé. Nastavení 50ms trvá pod Windows asi půl sekundy, zatímco jinde je korektně rychlé. Je nutné tedy nalézt určitý kompromis mezi skutečným číslem trvání a trváním snímku na majoritní platformě. Firma Microsoft dokazuje že nedodržování standardů u ní platí i pro jednotky času. V tomto případě se snad nejedná o úmysl, ale mizernou implementaci časovače. Animaci necháme rotovat donekonečna nastavením loop forever.

Pakliže nejste spokojeni s výslednou velikostí animace, existuje šance, že specializované optimalizační utility jako GIFsicle vám pomůžou velikost ještě malinko srazit. Osobně jsem ovšem k nějakým závratným změnám nedospěl, i když parametr -O2 občas pomůže.

Doufám, že se vám malý úvod do animování v GIMPu líbil. GAP toho umí samozřejmě daleko víc, ale o tom snad někdy příště.

root_podpora


** GAP – kromě zkratky GIMP animation package, znamená anglický výraz gap též mezeru

Byl pro vás článek přínosný?