前回のおさらいです。
前回、私は、Cropフィルタに対する不満として、次の3つを挙げました。
前回、私は、Cropフィルタに対する不満として、次の3つを挙げました。
|
では実際に、関数を作っていくことにしましょう。
いろいろなやり方があるとは思いますが、ここでは、上の3つの不満を元に、関数の概要(どのような関数にするか)を考えることから始めてみます。
いろいろなやり方があるとは思いますが、ここでは、上の3つの不満を元に、関数の概要(どのような関数にするか)を考えることから始めてみます。
[関数の概要]
|
おおざっぱにですが、このように考えてみました。
問題は、引数の順番を入れ替えることと、いかにして書式1の引数widthとheightを求めるかということの2点です(書式2をベースにすれば、後者は関係ありません)。4.のクリップ属性フィルタについては、後述します。
問題は、引数の順番を入れ替えることと、いかにして書式1の引数widthとheightを求めるかということの2点です(書式2をベースにすれば、後者は関係ありません)。4.のクリップ属性フィルタについては、後述します。
(1)関数名と引数リスト
さて、まずは作りやすいところから、順に作っていくことにしましょう。作っていくうちに、もしマズイ部分が出てきたら、その都度、直せばいいのですから。
この場合、関数名と引数がすでに決まっていますので、ここから作り始めることにします。関数の1行目、「function 関数名(引数リスト)」の部分です。
関数名はEasyClipping、引数はclipとtop, bottom, left, rightの5つですから、関数の1行目は次のようになります。
さて、まずは作りやすいところから、順に作っていくことにしましょう。作っていくうちに、もしマズイ部分が出てきたら、その都度、直せばいいのですから。
この場合、関数名と引数がすでに決まっていますので、ここから作り始めることにします。関数の1行目、「function 関数名(引数リスト)」の部分です。
関数名はEasyClipping、引数はclipとtop, bottom, left, rightの5つですから、関数の1行目は次のようになります。
|
まず最初に、clip型の引数(例ではclip)が必要となります。
|
-----> |
|
このようにclip型の引数があることによって、ビデオを受け入れて、そのビデオに対して関数を実行することができるのです。いわば、ビデオの入り口を作ってやるわけです。
他の引数については、関数化の方針3の通り、top, bottom, left, right(上下左右)の順にしました。
この4つの引数のデータ型は、Cropフィルタの各引数と同じint型にします。
必ず、「データ型1 引数1, データ型2 引数2, データ型3 引数3, ...」という風に記述してください。
(2)メイン関数
では次に、メインとなる関数内部を作っていきます。{ }で囲まれた範囲のことです。
関数の内部は、たとえば下記のように記述します(一例)。
他の引数については、関数化の方針3の通り、top, bottom, left, right(上下左右)の順にしました。
この4つの引数のデータ型は、Cropフィルタの各引数と同じint型にします。
必ず、「データ型1 引数1, データ型2 引数2, データ型3 引数3, ...」という風に記述してください。
(2)メイン関数
では次に、メインとなる関数内部を作っていきます。{ }で囲まれた範囲のことです。
関数の内部は、たとえば下記のように記述します(一例)。
|
これは、変数を使った記述法と一緒ですね。
あるいは、変数とreturn文を省略して、次のように書くことも出来ます。
あるいは、変数とreturn文を省略して、次のように書くことも出来ます。
|
関数といっても、まったく新しいフィルタを作るわけではありません。
関数の内部では、既存のフィルタ(または別の関数)を実行し、その結果を返します。
関数の内部では、既存のフィルタ(または別の関数)を実行し、その結果を返します。
|
---------------> 引数(clip, top, bottom, left, right) <--------------- |
|
ですから、関数の中においても、通常のスクリプトと同様に記述すればいいわけです。
具体的には、次のように記述します。
具体的には、次のように記述します。
|
Cropフィルタを、そのまま記述しただけです(変数を省略した記述法でも構いません)。
EasyClipping関数で指定されたclip, top, leftの値が、そのまま、Cropフィルタのclip, top, leftに、それぞれ代入されます。引数の順番を入れ替えること自体は、この方法で実現できます。
ただし、このままでは動作しません。Cropフィルタのwidthとheightが指定されていないからです。
では、どうすれば、widthとheightを求めることができるのでしょうか?
ここで登場するのが、クリップ属性フィルタです。
EasyClipping関数で指定されたclip, top, leftの値が、そのまま、Cropフィルタのclip, top, leftに、それぞれ代入されます。引数の順番を入れ替えること自体は、この方法で実現できます。
ただし、このままでは動作しません。Cropフィルタのwidthとheightが指定されていないからです。
では、どうすれば、widthとheightを求めることができるのでしょうか?
ここで登場するのが、クリップ属性フィルタです。
クリップ属性(Clip Properties)フィルタは、ビデオクリップのサイズ、色空間、フレームレートといったクリップに関する情報を取得することができるフィルタです。
ここでは、クリップの高さを調べるHeight()と、幅を調べるWidth()を使います。
ここでは、クリップの高さを調べるHeight()と、幅を調べるWidth()を使います。
Height(clip) Width(clip) |
どちらも引数はクリップのみです。ですから、
|
これで、ビデオクリップ(clip)の高さを求めることができます。また、Widthの部分をHeightに置き換えれば、幅を求めることができます。
さて、ここで私たちが求めなければならないのは、Cropフィルタの書式1の引数widthとheightでした。これは、Cropした後の、画像の幅と高さでしたね。
今や私たちは、クリップ属性フィルタを使って、元の画像全体の幅と高さを知ることができるようになりました。
これらの値とEasyClipping関数の引数(top, bottom, left, right)を組み合わせれば、widthとheightを求めることもできます。

つまり上の図で言うと、クリップ全体の幅(clip.Width())から、leftとrightを引けば、widthを求めることができるのです。
これをスクリプトで表すと、次のようになります。
さて、ここで私たちが求めなければならないのは、Cropフィルタの書式1の引数widthとheightでした。これは、Cropした後の、画像の幅と高さでしたね。
今や私たちは、クリップ属性フィルタを使って、元の画像全体の幅と高さを知ることができるようになりました。
これらの値とEasyClipping関数の引数(top, bottom, left, right)を組み合わせれば、widthとheightを求めることもできます。

つまり上の図で言うと、クリップ全体の幅(clip.Width())から、leftとrightを引けば、widthを求めることができるのです。
これをスクリプトで表すと、次のようになります。
|
同様にして、heightも、次のように求めることができます。
|
これを、EasyClipping関数に組み込んでみます。
|
これで、EasyClipping関数は、"一応"、動作するようになったと思います。
"とりあえず"、EasyClipping関数の完成です。
"とりあえず"、EasyClipping関数の完成です。
前のページ | 次のページ |