## Animate / ApplyRange

`Animate` (clip, int start_frame, int end_frame, string filtername, start_args, end_args)
`ApplyRange` (clip, int start_frame, int end_frame, string filtername, args)

`Animate` je meta-filtr, který vyvolá filtr uvedený v jeho parametru filter s plynule se měnícími argumenty. Pro snímky do start_frame včetně, se filtr filtername vyvolává s argumenty start_args. Pro snímky od end_frame, se filtr filtername vyvolá s argumenty end_args. Pro snímky mezi start_args a end_frame se pro hladký přechod hodnoty argumentů lineárně interpolují.

`ApplyRange` je speciální typ `Animate` kde start_args = end_args, a objevil se ve verzi v2.51 . Může být použit, když chcete aplikovat určitý filtr na určitém rozsahu snímků klipu - na rozdíl od Animate, jsou snímky mimo rozsah start_frame až end_frame po průchodu nedotčeny. Další rozdíl od `Animate` je, že argumenty args nemohou obsahovat klip. Počínaje verzí v2.53 podporuje audio, a start_frame může být rovno end_frame (tzn., že se zpracuje jen jeden snímek).

V případech kdy velký počet rozsahů potřebuje podobnéé zpracování za použití mnoha volání `ApplyRange` může způsobit problémy resourců. Alternativou může být použití ConditionalReader spolu s ConditionalFilter pro výběr mezi nezpracovanou a zpracovanou verzí zdroje.

Jméno použitého filtru musí být v uvozovkách (tzn. je to řetězec - string), a dva vložené seznamy argumentů nejsou ohraničeny závorkami. Řetězce (strings) a videoklipy nemohou být interpolovány, a proto musí mít stejné hodnoty v obou seznamech argumentů. Důležité upozornění: Jestli používáte klip jako první argument Animate , pak stejný klip nesmí být zahrnut v seznamu předávaných argumentů start_args a end_args . Příklad:

    v = Version()
    Animate(v,0,149,"Crop", v,0,0,64,32, v,316,0,64,32)

vyvolá chybu, protože první snímek je stejný jako neplatná syntaxe Crop(v, v, 0, 0, 64, 32).

Filtr bude nesprávně zpracovávat změnu zvukové stopy, proto jej nedoporučuji používat s filtry, které mění zvukovou stopu. A nepokoušejte se zadávat počáteční a koncové parametry vedoucí k různým rozměrům snímku.

Argument filtername dokonce může být samotným filtrem `Animate` , jestli chcete raději kvadratickou interpolaci než lineární.

Několik příkladů:

    # Vytvořit protočení (scrolling) videa s verzí "Version":
    ver = Version()
    Animate(0,149,"Crop", ver,0,0,64,32, ver,316,0,64,32)

    # nebo, což je stejné:
    ver = Version()
    Animate(ver,0,149,"Crop", 0,0,64,32, 316,0,64,32)

    # Stmívání (Fade) do bíla
    AviSource("E:\pdwork\DO-Heaven.AVI")
    Animate(100,200,"Levels", 0,1,255,0,255, 0,1,255,255,255)

    # Postupné zvětšení střední části videa s rozlišením 320x240 ,
    #počínaje od zvětšení 1:1 ve snímku 100 a konče s měřítkem 4:1
    #ve snímku 200:
    clip = AviSource("E:\pdwork\DO-Heaven.avi")
    Animate(100,200,"BicubicResize", clip,320,240,0,0,320,240, clip,320,240,120,90,80,60)
    # Animate(clip, 100,200,"BicubicResize", 320,240,0,0,320,240, 320,240,120,90,80,60) # also works

    # Zvětšit text "Hello, World!" ze středu videa velikosti 320x240:
    BlankClip(width=320, height=240)
    Animate(0,48,"Subtitle", "Hello, World!",160,120,0,99999,"Arial",0,
      \  "Hello, World!",25,130,0,99999,"Arial",48)

Zvětšení klipu c2 se současným překrytím na c1:

    Function myfunc(clip c1, clip c2, int x, int y, int w, int h)
    {
      w = w - w%2
      h = h - h%2
      my_c2 = BicubicResize(c2,w,h)
      Overlay(c1,my_c2,x,y)
    }

    c1 = AviSource("D:\Captures\jewel.avi") # c1 je větší než c2
    c2 = AviSource("D:\Captures\atomic.avi").BicubicResize(320,240)
    Animate(0,1000,"myfunc",c1,c2,10,10,10,10,c1,c2,300,300,360,288)
    # nebo
    # Animate(c1,0,1000,"myfunc", c2,10,10,10,10, c2,300,300,360,288)

    # ale následující zápis nebude pracovat, protože byly předány tři klipy funkci
    # myfunc (c1, c1 and c2), namísto dvou:
    # Animate(c1,0,1000,"myfunc",c1,c2,10,10,10,10,c1,c2,300,300,360,288)

Malý obraz zvětšit na černý klip dokud se nezamění hlavním klipem (sám sebou):

    function res(clip clip, clip "LClip", int "width", int "height", int "centerX", int "centerY") {  LClip = BicubicResize(LClip, width, height)
      Overlay(clip, LClip, centerX-LClip.width/2, centerY-LClip.height/2)
    }

    function resize(clip clip, clip "LClip",
      \ int "end_frame", int "end_width", int "end_height", int "centerX", int "centerY") {
      return Animate(start_frame, end_frame, "res", clip, LClip, start_width, start_height, centerX, centerY,

    \   clip, LClip, end_width,   end_height,   centerX, centerY)
    }

    clip = AviSource("D:\captures\jewel.avi")
    clip = clip.BicubicResize(640,480)
    clip = clip.ConvertToRGB()
    black = BlankClip(clip)

    resize(black, clip, 0, 120, 120*clip.height/clip.width, 500, 640, 480, clip.width/2, clip.height/2)

Příklady využívající ApplyRange:

    ver = Version()
    return ver.ApplyRange(0,149,"Crop", 158,0,64,32)
    # dává chybu, protože nemůže mít různé velikosti snímků v klipu

    Version()
    ApplyRange(100,149,"Blur", 1.0)

    AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
    ApplyRange(0,48,"Subtitle","Hello World!",25,130,0,99999,"Arial",48)

    #nebo, což je stejné:
    clip = AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
    ApplyRange(clip,0,48,"Subtitle","Hello World!",25,130,0,99999,"Arial",48)

    # ale protože rozsah snímků lze poskytnout do Subtitle samotného, je to stejné jako:
    AviSource("E:\pdwork\DO-Heaven.avi").BicubicResize(320,240)
    Subtitle("Hello, World!",25,130,0,48,"Arial",48)

`$English Date: 2008/12/06 17:50:04 $`

`Český překlad:12.2.2009`