AviSynthのぺーじ/関数を作る理由(2)
これは、かつて「にーやんのAviSynthのぺーじ」として公開されていたものを転載したものです。内容は古く、間違いも含まれている可能性があります。より正確で新しい情報を知りたい場合は、AviSynth 付属のヘルプや AviSynth 公式サイトを参考にすることをおすすめします。AviSynth Wiki の AviSynth入門なども活用してください。
スクリプトゆえの煩雑さと自由度 †
あらためて言うまでもありませんが、AviSynthは動画編集用のスクリプト言語です。
スクリプトを記述することによって、ソースを読み込んだり、フィルタをかけたりします。このため、パラメータの指定の仕方がわかりづらかったり、使い勝手がよくないと感じることが、しばしばあります。
これはスクリプトゆえに生じ弊害とであると言えるでしょう。
しかし一方で、スクリプトだからこその柔軟性(自由度の高さ)もあります。
使いにくいと感じるフィルタがあれば、自分が使いやすいようにカスタマイズして関数化することができるのです。
これが「関数をつくる理由」のその2、フィルタのカスタマイズです。
あるフィルタを例に、具体的に見ていきましょう。
Cropフィルタ †
Cropというフィルタがあります。
Crop(クロップ)は「縁を切り落とす」という意味の英語で、Cropフィルタは画像端の黒縁や、ビデオテープからキャプチャした際に入る画面下端のノイズなど、不要な部分を切り落とすために使用します。AviSynth内蔵のフィルタです。
Cropフィルタの使い方については、チュートリアルで説明していますので、そちらを参考にしてください。
さて私は、このCropフィルタを使っていて、少々「使いづらい」と感じました。
マニュアルを見ると、Cropの書式は、次のようになっています*1。
Crop(clip clip, int left, int top, int width, int height) Crop(clip clip, int left, int top, int -right, int -bottom)
ご覧のように、Cropフィルタには2種類の書式があります。
書式1:widthとheightで指定する方法 †
Crop(clip clip, int left, int top, int width, int height)
これはAviSynthのすべてのバージョンで共通して使える書式です。
図のピンク色の部分がCropする範囲を表しています。
この方法では、引数leftで左端のクロップ幅を、引数topで上端のクロップ幅を指定します。これはわかりやすいと思います。
残りの2つの引数、widthはクロップ後の画像の幅を、heightはクロップ後の画像の高さを指定します。
右端のクロップ幅と下端のクロップ幅は直接指定することができません。
例えば、右端にクロップしたい領域があるとします(図のrightの部分)。
このとき、rightの幅を決定するためには、leftとwidthから計算して調整する必要があります。
これは少し面倒です。
書式2:右と下を負の値で指定する方法 †
Crop(clip clip, int left, int top, int -right, int -bottom)
こちらはAviSynth2.0.1から追加された書式で、上下左右の各クロップ幅をそれぞれ指定することができます。
ただし右端と下端は、それぞれ-rightと-bottomのように、負の符号を付けて指定します。
これは、書式1と区別するための措置であると考えられます。負の符号を付けないと、-rightはwidth、-bottomはheightと解釈されます。
書式2は、書式1に比べると、わかりやすいようにも思えます。
しかし私は、負の符号を付けなければいけないことや、「左, 上, 右, 下」という指定順序が、直感的にわかりづらいと感じました。
以上のことから、私のCropフィルタに対する不満(というよりも、「ここが直れば、もっと使いやすいのに・・・」と思ったこと)をまとめると、次の3点になります。
- 書式1で、width・heightの指定方法はわかりづらい。
- 書式2で、負の符号を付けなければならないのが、ややこしい。
- どちらの書式においても、引数の順序が直感的ではない。 さて、これからが本番です。
上で挙げた3つの不満、これを元に、そしてこれを解消するべく、関数を作っていきます。
しかし、すでに説明が長くなってしまいましたので、具体的な関数の作成方法については、次回、行うこととします。
最終更新日 2004年6月19日
*1 ※AviSynth2.5.3からalignパラメータが追加されましたが、ここでは話が複雑になるので省略します。alignパラメータについては、チュートリアルで簡単にですが説明していますので、そちらを参考にしてください。