FilterRangePlus
2ちゃんねるのAvisynthスレッドで、「FilterRangeを複数指定したいときに、簡単に記述する方法がないか」という話題が出ていたので、ちょっと考えてみました。
本当は2ちゃんねるの方に書き込もうと思ったのですが、説明がかなり長くなってしまったので、ここに書くことにしました。
それに、この話題自体はすでに終わってしまったようですからね(乗り遅れた 笑)。
この関数のメリットとしては、指定する範囲の数を簡単に増やせることでしょうか(デフォルトでは3つだけ)。
逆にデメリットというか、イマイチなところは、設定の仕方がややこしかったり、ちゃんと動作するか自信がないということでしょうか(ぉぃぉぃ)。
個人的にループさせる関数を使ってみたくて作ったという感じなので、テスト版と考えてください。
説明
minamina氏作FilterRange関数を改造して、フィルタを適用できる範囲の数を増やした。
フィルタの適用範囲の数を調節することも可能。
メインのFilterRangePlus関数とサブのRecursiveA, RecursiveB, RecursiveCの3つの関数を
セットで使用します。
書式
FilterRangePlus(clip clip, string "filter", int "times", \ int "s1", int "e1", int "s2", int "e2", int "s3", int "e3", ...)
パラメータ
- filter:使用したいフィルタ
- times:フィルタを適用する範囲の数
- s*:適用開始点(*は数字)
- e*:適用終了点(*は数字)
※s*,e*は増やすことが可能(下記「応用」を参照)
使用例
FilterRangePlus("GreyScale()", 3, 21,28, 12,17, 3,6)
[重要]
適用範囲を複数指定する場合、フレーム番号が大きい範囲から順番に指定してください。
たとえば、3-6, 12-17, 21-28の3つの範囲を指定する時は、21-28, 12-17, 3-6の順になります。
×3,6, 12,17, 21,28
○21,28, 12,17, 3,6
やってはいけない
- フィルタ適用範囲の数(times)が間違っている。多すぎる場合はエラーが出るようにしています。
- フィルタ適用範囲の順番が小さい番号からになっている(例)6,9, 13,17
- フィルタ適用範囲がかぶっている(例)12,16, 8,14
- フィルタ適用範囲が連続している(例)5,9, 3,5→3,9と1つにまとめる
応用(フィルタ適用範囲の数をふやす)
関数の()内に「,int "s*", int "e*"」を追加することで、フィルタ適用範囲の数を
増やすことができます。(*は数字)
(例)5箇所指定できるようにする
function FilterRangePlus(〜 int "e3", int "s4", int "e4", int "s5", int "e5")
メイン関数
function FilterRangePlus(clip clip, string "filter", int "times", \ int "s1", int "e1", int "s2", int "e2", int "s3", int "e3") { Assert(IsInt(Eval("s" + String(times))), "timesが正しくない") Assert(s1 > s2 && e2 < s1, "範囲指定が正しくない") d = (Eval("s" + String(times)) < 2) ? clip.Trim(0, -1) : \ clip.Trim(0, Eval("s" + String(times)) - 1) Eval(RecursiveA("", times, filter)) Eval(RecursiveB("", times-1)) c0 = (e1 > clip.FrameCount()-2) ? BlankClip(clip,1) : clip.Trim(e1 + 1, 0) c = (Eval("s" + String(times)) == 0) ? Eval(RecursiveC("", (times*2)-1) + "c0") : \ d + Eval(RecursiveC("", (times*2)-1) + "c0") c = (e1 > clip.FrameCount()-2) ? c.Trim(0, clip.FrameCount()-1) : c return c }
サブ関数
function RecursiveA(string s, int times, string filter) { return (times == 0) ? s : \ "c" + String(times*2-1) + " = clip.trim(s" + String(times) + ", e" + \ String(times) + ")." + filter + " " + RecursiveA(s, times-1, filter) } function RecursiveB(string s, int times) { return (times == 0) ? s : \ "c" + String(times*2) + " = clip.trim(e" + String(times+1) + "+1, s" + \ String(times) + "-1)" + " " + RecursiveB(s, times-1) } function RecursiveC(string s, int times) { return (times == 0) ? s : "c" + String(times) + " + " + RecursiveC(s, times-1) }