Script-Fu 青空教室
四限目 | Script-Fu 青空教室 | 放課後


五限目 実践的なスクリプト

三限目では、スクリプトを書き上げるまでの基本的な流れを説明しました。しかし、実践的なスクリプトを実際に書こうとすると、いくつか考えなければならない事やテクニックが必要になってきます。ここでは Script-Fu をさらにステップアップさせるためのチップが書かれています。

5.1 画像依存型スクリプトで考慮すべきこと

独立実行型スクリプトでは、自分で最初から画像を作っていくので初期条件は自分で決めることができます。それに対し、画像依存型スクリプトを実行する時、実行した時の状態についても考慮しなければならない場合があります。

どのようなことについて注意しなければならないかについて、リストアップしてみます。

  1. 対象がレイヤーなのか、レイヤーマスクなのか、チャンネルかなのか、あるいはインデックスか
      これはスクリプトの性格によって異なります。script-fu-register の許可する画像のタイプで全てを受け入れられるようにするのが望ましいでしょうが、画像に対して処理を行う大抵のスクリプトの場合、RGB* や GRAY* になるでしょう。GRAY の場合ではレイヤーマスクやチャンネルに対してスクリプトを適用しても問題ないかどうかがポイントになります。これらに対してレイヤーマスクを追加するような操作は行えません。
  2. レイヤーマスクがある場合はどうするか
      上の条件に重なりますが、画像の種類に RGBA と GRAYA を許可する場合はレイヤーマスクが存在するケースも考えられるので、その場合はどうするのかを決めなければなりません。"レイヤーにレイヤーマスクが存在する場合は適用" するということを予め行ってから実際のスクリプト処理を行うようにすれば問題ないでしょう。
  3. 透明領域はどうするか
      RGBA や GRAYA や INDEXEDA では、アルファチャンネルを持つことができます。特に、中間調のアルファ度を持つことができる RGBA と GRAYA では、完全に不透明な状態と比較して、透明部分の処理結果が違うということがよく発生します。透明部分がどうなるかを見極めながら処理を行うようにします。
  4. 選択領域をどうするか
      画像に選択領域が存在する場合、ぼかしフィルターを行うと選択領域内だけがぼかされます。これと同じように、画像に選択領域がある状態でスクリプトを実行するとどうなるのかについても考慮しなければなりません。最初に gimp-selection-none で選択領域を消去してしまうのも一手ですが、できればこれを避け、アクティブな選択領域がある場合はその選択領域内だけに効果があるようにした方が良いでしょう。

通常これらは全てを考慮する必要が無いかもしれませんが、自分が今作りたいスクリプトの目的をよく考え、これらのことを念頭に置きながら開発を進めるようにしましょう。

5.2 入力ボックスの引数型

スクリプト中でパターンやグラデーションを使いたい場合、スクリプトを実行するときにユーザーが入力ボックスでパターンやグラデーションを選択できるようにしなければいけません。この入力ボックスに使用できる引数型の説明をしていきます。

5.2.1 入力ボックスに使用できる引数型

入力ボックスに使用できる引数として、以下の表にあるものが使えます。個々の詳しい説明はこの後でします。これらを必要に応じて用いることで、ユーザーにダイアログで指定させることができるようになります。

表: Script-Fu で使用できる引数型
引数型説明データの種類データ例
SF-ADJUSTMENT範囲内で数値を選択させるリスト'(16 1 128 1 5 1)
SF-BRUSHブラシを選択させるリスト'("Circle (15)" 1.0 20 0)
SF-CHANNELチャンネルを選ばせる整数0
SF-COLOR色を選ばせる整数のリスト'(0 127 255)
SF-DRAWABLEドロアブルを選択させる整数0
SF-FILENAMEファイルを選ばせる文字列"/FILENAME"
SF-FONTフォントを選ばせる文字列"-*-Eras-*-r-*-*-24-*-*-*-p-*-*-*"
SF-GRADIENTグラデーションを選択させる文字列"Blue_Green"
SF-IMAGE画像を選ばせる整数0
SF-LAYERレイヤーを選ばせる整数0
SF-OPTIONドロップダウンリストから一つを選択させる文字列のリスト'("Option 1" "Option 2" "Option 3")
SF-PATTERNパターンを選択させる文字列"Parque #1"
SF-STRING文字列を入力させる文字列"The Gimp"
SF-TOGGLE真偽値を選択させる (トグルのオン/オフ)ブーリアン値FALSE
SF-VALUE数値を入力させる数値"10"

これらの中から必要な入力ボックスを作る引数型を選んで使用します。実際に自分で入力ボックスを作ってみたほうが分かりやすいでしょう。

5.2.2 全ての引数型を使った例

実際に上で挙げた全ての引数型を使ったスクリプトを作ってみます。そのスクリプトの実行結果がこのダイアログです。ここには全ての入力ボックスがあります。

全ての引数を持つ入力ボックス 全ての入力ボックスを持つスクリプト
全ての入力ボックス  
(define (script-fu-all-input-boxes
                adjustment0 adjustment1 brush channel color
                drawable filename font gradient image layer
                option pattern string toggle value)

  (gimp-message "This is the input box test script!")
)

(script-fu-register
  "script-fu-all-input-boxes"
  "<Toolbox>/Xtns/Script-Fu/Test/All Input Boxes..."
  "Show all input boxes"
  "Iccii <iccii@hotmail.com>"
  "Iccii"
  "Jun, 2001"
  ""
  SF-ADJUSTMENT "SF-ADJUSTMENT 0" '(256 1 1024 1 10 0 0)
  SF-ADJUSTMENT "SF-ADJUSTMENT 1" '(256 1 1024 1 10 0 1)
  SF-BRUSH      "SF-BRUSH"        '("Circle (15)" 1.0 20 0)
  SF-CHANNEL    "SF-CHANNEL"      0
  SF-COLOR      "SF-COLOR"        '(255 255 255)
  SF-DRAWABLE   "SF-DRAWABLE"     0
  SF-FILENAME   "SF-FILENAME"     "/FILENAME"
  SF-FONT       "SF-FONT"         "-*-Eras-*-r-*-*-24-*-*-*-p-*-*-*"
  SF-GRADIENT   "SF-GRADIENT"     "Blue_Green"
  SF-IMAGE      "SF-IMAGE"        0
  SF-LAYER      "SF-LAYER"        0
  SF-OPTION     "SF-OPTION"       '("Option1" "Option2" "Option3")
  SF-PATTERN    "SF-PATTERN"      "Parque #1"
  SF-STRING     "SF-STRING"       "The Gimp"
  SF-TOGGLE     "SF-TOGGLE"       FALSE
  SF-VALUE      "SF-VALUE"        "10"
)

右上の (gimp-message "This is the input box test script!") の行を下の gimp-message 出力と交換してスクリプトを実行すると、右下にあるように入力ボックスを変化させたときにどのような値を受け渡すことになるのか見ることができます。興味のある人は色々と変化させながら試してみて下さい。ブラシ名やパターン名やグラデーション名を確認したい時に便利かもしれません。

  (gimp-message (string-append 
    "Adjust0 is "  (number->string adjustment0) "\n"
    "Adjust1 is "  (number->string adjustment1) "\n"
    "Brush is "    "'(" "\"" (list-ref brush 0) "\" "
                        (number->string (list-ref brush 1)) " "
                        (number->string (list-ref brush 2)) " "
                        (number->string (list-ref brush 3)) ")\n"
    "Channel is "  (number->string channel) "\n"
    "Color is "    "'(" (number->string (car color)) " "
                        (number->string (cadr color)) " "
                        (number->string (caddr color)) ")\n"
    "Drawable is " (number->string drawable) "\n"
    "Filename is " "\"" filename "\"\n"
    "Font is "     "\"" font "\"\n"
    "Gradient is " "\"" gradient "\"\n"
    "Image is "    (number->string image) "\n"
    "Layer is "    (number->string layer) "\n"
    "Option is "   (number->string option) "\n"
    "Pattern is "  "\"" pattern "\"" "\n"
    "String is "   "\"" string "\"\n"
    "Toggle is "   (if (equal? toggle TRUE) "TRUE\n" "FALSE\n")
    "Value is "    (number->string value)  ))
  交換した場合の出力例

5.2.3 個々の引数型の説明

それぞれの引数型が何を指定させるものなのかは上のダイアログを見れば大体分かると思います。この下ではそれぞれの引数型の説明と、引数型に伴うデータ型の説明をします。

SF-ADJUSTMENT

ある範囲内で数値を選ばせるアジャスターを作ります。アジャスターの種類には、スライダーとスピンボックスがあります。スピンボックスの場合は、スピンボタンを押し続けて最大値を超えた場合に最小値になります。逆も同様です。

デフォルトの値はアジャスターの初期値です。最大値と最小値は選択できる数値の範囲です。ときどき最小値を 0 にするのか 1 にするのかを考慮しなければならない場面があります。ステップ幅小はスピンボックスのスピンボタンを押したときの数値の変化量の値です。ステップ幅大はスライダーを連続して動かした時に一度に変化する量です。精度は有効な小数点位で、0 とした場合は整数を、1 とした場合は 0.1 の位を、2 とした場合は 0.01 の位を、などのように有効桁数を指定します。アジャスターの種類は、0 とするとスライダーに、1 とするとスピンボックスになります。

SF-BRUSH

ユーザーにブラシを選ばせます。ブラシの名前はブラシ選択ダイアログの上部に出ている名称と必ずしも一致するわけではありません。現在のブラシの名前を調べるには (gimp-brushes-get-brush "") を Script-Fu コンソールに入力します。

ブラシのリストの先頭はブラシの名前 (文字列) で、残りは数値です。不透明度、間隔、ブラシモードです。

SF-CHANNLE

これを書いておくと、スクリプトを実行した時点で利用できるチャンネルをユーザーに選ばせるドロップダウンリストが現れます。利用できるチャンネルが無ければ "none" とグレーアウトされ、選択できないようになります。選択したチャンネルの ID が返ってきます。

チャンネルの ID 値を指定します。ID 値は作成された順番に Gimp によって割り当てられる、チャンネルを識別するための整数です。チャンネルには予約チャンネルを除いた残りのチャンネルが入ります。通常はチャンネルの番号がスクリプトを書いた時点で判明していることは無いので、チャンネル ID は 0 としておきます。

SF-COLOR

色ボタンを押すことでユーザーに色選択ダイアログで色を指定させます。選んだ色のリストが返ってきます。

三つの数値の要素からなるリストで、赤/緑/青を表す数値をそれぞれ 0 から 255 の範囲で指定します。例えば赤色の場合は '(0 255 255) となります。

SF-DRAWABLE

これを書いておくと、スクリプトを実行した時点で利用できるドロアブルをユーザーに選ばせるドロップダウンリストが現れます。利用できるドロアブルが無ければ "none" とグレーアウトされ、選択できないようになります。選択したドロアブルの ID が返ってきます。

ドロアブルの ID 値を指定します。ID 値は作成された順番に Gimp によって割り当てられる、ドロアブルを識別するための整数です。ドロアブルはレイヤーとレイヤーマスクとチャンネルの総称です。通常はドロアブルの番号がスクリプトを書いた時点で判明していることは無いので、ドロアブル ID は 0 としておきます。

SF-FILENAME

ユーザーにファイルを指定させます。ファイル名の隣のボタンを押すとファイル選択ダイアログが開きます。ここでファイルを選択すると、ファイルまでのフルパスを含めた文字列が返されます。

文字列でファイルの名前を指定します。パスを "/" で区切ってファイルまでのフルパスを書きます。例えば "/home/miname/picture.jpg" など。

SF-FONT

ユーザにフォントを指定させます。現在のフォント名の隣のボタンを押すと、フォント選択ダイアログが開きます。ここで指定したフォントが返されます。

文字列でフォントを指定します。フォントの "-*-Eras-*-r-*-*-24-*-*-*-p-*-*-*" という文字列は、フォント選択ダイアログでフォントを指定した後でタブをフォント情報に切り替えた時に出る実際のフォント名を使います。厳密に制限しない場合は、フォント属性のいくつかをアスタリスク "*" に置き換えることができます。

SF-GRADIENT

グラデーションのボタンを押すことで、グラデーション選択ダイアログでグラデーションをユーザーに選ばせます。選択したグラデーション名が返ってきます。

グラデーション名はグラデーション選択ダイアログで分かります。

SF-IMAGE

ドロップダウンリストからユーザーに画像を選ばせます。現在開いている画像が無い場合、none になります。選択した画像 ID が返ってきます。

画像 ID は整数です。普通は選択する画像 ID をスクリプトを書く時点で判っていることはないので 0 としておきます。

SF-LAYER

これを書いておくと、スクリプトを実行した時点で利用できるドロアブルをユーザーに選ばせるドロップダウンリストが現れます。利用できるドロアブルが無ければ "none" とグレーアウトされ、選択できないようになります。選択したドロアブルの ID が返ってきます。

レイヤーの ID 値を指定します。ID 値は作成された順番に Gimp によって割り当てられる、レイヤーを識別するための整数です。レイヤーにレイヤーマスクがある場合、レイヤーかレイヤーマスクのアクティブになっている方が渡されます。通常はレイヤーの番号がスクリプトを書いた時点で判明していることは無いので、レイヤー ID は 0 としておきます。

SF-OPTION

ドロップダウンリストから一つをユーザーに選ばせます。先頭から何番目の要素を選んだのかという数値が返ってきます。

選ばせたいオプションの数だけ要素の文字列をリストで書きます。一番先頭の要素がデフォルトの要素になります。

SF-PATTERN

ユーザーにパターンを選択させます。隣のボタンを押すとパターン選択ダイアログが現れます。選択したパターンの名前が文字列で返ってきます。

パターン名は文字列です。パターン名はパターン選択ダイアログか、Script-Fu コンソールで (gimp-patterns-get-pattern "") を入力すると現在のパターンの情報が得られます。

SF-STRING

文字列を入力する欄が現れます。ここに数値を入力しても文字列として取り扱われます。入力した文字列が返ってきます。

デフォルトの文字列を入れておきます。デフォルトを省略 ("") しておくこともできます。

SF-TOGGLE

チェックボックスを作って、ユーザに有効/無効の選択をさせます。真偽値が数値で返ってきます。0 であれば偽 (FALSE) で、それ以外は真 (TRUE) と解釈されます。

デフォルトの真偽値を、真であれば TRUE を、もしくは偽であれば FALSE で指定します。TRUE の場合はチェックボックスにチェックが入った状態となります。

SF-VALUE

値を入力する欄が現れます。ここに入れた値はそのままの形で直接引数に入れられます。

値であればなんでも引数に直接渡すことができます (多分配列も OK)。昔はこれで全てまかなっていたようですが、数値指定のために SF-ADJUSTMENT が新たに作られました。そのため今は SF-VALUE の出番はあまりありませんが、例えばリストを引数にしたいときには SF-VALUE を使用します。

今回のスクリプトについて

今回作るスクリプトは、Photoshop でいうところのレイヤー効果のスクリプトです。これはレイヤーの不透明領域に対して、ドロップシャドウ、シャドウ (内側)、光彩 (外側)、光彩 (内側)、ベベルとエンボス、の効果を追加するものです。全て画像依存型スクリプトです。

今回のスクリプトは実践編ということで、Script-Fu を書く上で実際に必要になることはある程度把握したものとみなしているので、個々の部分に対してあまり長い説明はしません。もし分からないところが出てきたら、これまでの内容を復習しておいて下さい。

ドロップシャドウ効果のスクリプト

3 限目にはドロップシャドウ文字を作るスクリプトを取り上げました。ここではレイヤーの不透明部分から透明部分にドロップシャドウをするスクリプトを作ります。両者の違いについてそれぞれきちんと把握しておきましょう。

ドロップシャドウ効果は最も基本的なレイヤー効果の一つです。そのため既に Gimp 標準付属のスクリプトにはドロップシャドウのスクリプトがいくつか含まれています。それらのスクリプトと今回のスクリプトを見比べてみるのも勉強になると思います。同じことをするにもいくつかの方法があることに気が付くことでしょう。

ドロップシャドウ

ドロップシャドウのスクリプト

シャドウ内側効果のスクリプト

先程は不透明部分の外側に影を落としていましたが、次は不透明部分の中に影を落とす効果です。

シャドウ内側

シャドウ内側のスクリプト

レイヤー光彩外側効果のスクリプト

不透明部分がまるで外側に向かって発光しているかのような効果のスクリプトです。

レイヤー光彩外側

レイヤー光彩外側のスクリプト

レイヤー光彩内側効果のスクリプト

外側から不透明部分の中に向かって発光しているかのような効果のスクリプトです。光彩のタイプとして、不透明部分の縁が光るのか内部が光るのかを選ぶことができます。

レイヤー光彩内側

レイヤー光彩内側のスクリプト

スクリプトの発展

今回の四つのスクリプトを入力した人は多分、それぞれのスクリプトがほとんど同じような手順になっていることに気が付くでしょう。実際、これらの効果は非常に良く似た手順で行うことができます。

スクリプトの中から共通する部分を抜き出して、それを一つの関数として書き、共通関数をそれぞれの効果のスクリプトから呼び出すことでそれぞれの効果が行えるようになればスクリプトが簡潔になります。

共通関数を呼び出す時には、それぞれのスクリプトの固有の処理を共通関数に何らかの方法で教えてやる必要があります。この辺を工夫しなければなりません。

2001/11/24

四限目 | Script-Fu 青空教室 | 放課後