Top > ScriptFuClass > Step5

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

䞉限目では、スクリプトを曞き䞊げるたでの基本的な流れを説明したした。しかし、実践的なスクリプトを実際に曞こうずするず、いく぀か考えなければならない事やテクニックが必芁になっおきたす。ここでは Script-Fu をさらにステップアップさせるためのチップが曞かれおいたす。

5.1 画像䟝存型スクリプトで考慮すべきこず Edit

独立実行型スクリプトでは、自分で最初から画像を䜜っおいくので初期条件は自分で決めるこずができたす。それに察し、画像䟝存型スクリプトを実行する時、実行した時の状態に぀いおも考慮しなければならない堎合がありたす。

どのようなこずに぀いお泚意しなければならないかに぀いお、リストアップしおみたす。

1. 察象がレむダヌなのか、レむダヌマスクなのか、チャンネルかなのか、あるいはむンデックスか
これはスクリプトの性栌によっお異なりたす。script-fu-register の蚱可する画像のタむプで党おを受け入れられるようにするのが望たしいでしょうが、画像に察しお凊理を行う倧抵のスクリプトの堎合、RGB* や GRAY* になるでしょう。GRAY の堎合ではレむダヌマスクやチャンネルに察しおスクリプトを適甚しおも問題ないかどうかがポむントになりたす。これらに察しおレむダヌマスクを远加するような操䜜は行えたせん。
2. レむダヌマスクがある堎合はどうするか
䞊の条件に重なりたすが、画像の皮類に RGBA ず GRAYA を蚱可する堎合はレむダヌマスクが存圚するケヌスも考えられるので、その堎合はどうするのかを決めなければなりたせん。"レむダヌにレむダヌマスクが存圚する堎合は適甚" するずいうこずを予め行っおから実際のスクリプト凊理を行うようにすれば問題ないでしょう。
3. 透明領域はどうするか
RGBA や GRAYA や INDEXEDA では、アルファチャンネルを持぀こずができたす。特に、䞭間調のアルファ床を持぀こずができる RGBA ず GRAYA では、完党に䞍透明な状態ず比范しお、透明郚分の凊理結果が違うずいうこずがよく発生したす。透明郚分がどうなるかを芋極めながら凊理を行うようにしたす。
4. 遞択領域をどうするか
画像に遞択領域が存圚する堎合、がかしフィルタヌを行うず遞択領域内だけががかされたす。これず同じように、画像に遞択領域がある状態でスクリプトを実行するずどうなるのかに぀いおも考慮しなければなりたせん。最初に gimp-selection-none で遞択領域を消去しおしたうのも䞀手ですが、できればこれを避け、アクティブな遞択領域がある堎合はその遞択領域内だけに効果があるようにした方が良いでしょう。

通垞これらは党おを考慮する必芁が無いかもしれたせんが、自分が今䜜りたいスクリプトの目的をよく考え、これらのこずを念頭に眮きながら開発を進めるようにしたしょう。

5.2 入力ボックスの匕数型 Edit

スクリプト䞭でパタヌンやグラデヌションを䜿いたい堎合、スクリプトを実行するずきにナヌザヌが入力ボックスでパタヌンやグラデヌションを遞択できるようにしなければいけたせん。この入力ボックスに䜿甚できる匕数型の説明をしおいきたす。

5.2.1 入力ボックスに䜿甚できる匕数型 Edit

入力ボックスに䜿甚できる匕数ずしお、以䞋の衚にあるものが䜿えたす。個々の詳しい説明はこの埌でしたす。これらを必芁に応じお甚いるこずで、ナヌザヌにダむアログで指定させるこずができるようになりたす。

衚: Script-Fu で䜿甚できる匕数型

匕数型説明デヌタの皮類デヌタ䟋
SF-IMAGE画像を遞ばせる敎数0
SF-DRAWABLEドロアブルを遞ばせる敎数0
SF-LAYERレむダヌを遞ばせる敎数0
SF-CHANNELチャンネルを遞ばせる敎数0
SF-VECTORSベクトルを遞ばせる敎数0
SF-COLOR色を遞ばせる敎数のリスト'(0 127 255)
SF-TOGGLE真停倀を遞択させる (トグルのオン/オフ)ブヌリアン倀FALSE
SF-VALUE数倀を入力させる数倀"10"
SF-STRING文字列を入力させる文字列"The GIMP"
SF-FILENAMEファむルを遞ばせる文字列"/FILENAME"
SF-DIRNAMEディレクトリを遞ばせる文字列”/DIRNAME"
SF-ADJUSTMENT範囲内で数倀を遞択させるリスト'(16 1 128 1 5 1)
SF-FONTフォントを遞ばせる文字列"Eras"
SF-PATTERNパタヌンを遞択させる文字列"Parque #1"
SF-BRUSHブラシを遞択させるリスト'("Circle (15)" 1.0 20 0)
SF-GRADIENTグラデヌションを遞択させる文字列"Blue Green"
SF-OPTIONリストから䞀぀を遞択させる文字列のリスト'("Option 1" "Option 2" "Option 3")
SF-PALETTEグラデヌションを遞択させる文字列" "
SF-TEXTテキストを入力させる文字列"Hello, GIMP"
SF-ENUMGimp が持っおいる列挙型*1を遞ぶ列挙型名ずデフォルト倀のリスト'("InterpolationType" "linear")
SF-DISPLAYディスプレむを遞択させる敎数0

これらの䞭から必芁な入力ボックスを䜜る匕数型を遞んで䜿甚したす。実際に自分で入力ボックスを䜜っおみたほうが分かりやすいでしょう。

5.2.2 党おの匕数型を䜿った䟋 Edit

実際に䞊で挙げた党おの匕数型を䜿ったスクリプトを䜜っおみたす。そのスクリプトの実行結果がこのダむアログです。ここには党おの入力ボックスがありたす。

党おの入力ボックス

党おの入力ボックスを持぀スクリプト

※次のスクリプトを実行したずき、ダむアログで䜕もファむルを遞択しなかった堎合には script-fu.exe が萜ちる䞍具合がありたす (Windows)

(define (script-fu-all-inputs-box
                image drawable layer channel vectors color
                toggle value string filename dirname
                adjustment0 adjustment1 font pattern brush
                gradient option palette text enum display)

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

(script-fu-register
  "script-fu-all-inputs-box"
  "All Inputs Box..."
  "Show all inputs box"
  "Iccii <iccii@hotmail.com>"
  "Iccii"
  "Jun, 2001/May, 2009"
  ""
  SF-IMAGE      "SF-IMAGE"        0
  SF-DRAWABLE   "SF-DRAWABLE"     0
  SF-LAYER      "SF-LAYER"        0
  SF-CHANNEL    "SF-CHANNEL"      0
  SF-VECTORS    "SF-VECTORS"      0
  SF-COLOR      "SF-COLOR"        '(255 255 255)
  SF-TOGGLE     "SF-TOGGLE"       FALSE
  SF-VALUE      "SF-VALUE"        "10"
  SF-STRING     "SF-STRING"       "The Gimp"
  SF-FILENAME   "SF-FILENAME"     "/FILENAME"
  SF-DIRNAME    "SF-DIRNAME"      ""
  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-FONT       "SF-FONT"         "Sans"
  SF-PATTERN    "SF-PATTERN"      "Leopard"
  SF-BRUSH      "SF-BRUSH"        '("Circle (15)" 1.0 20 0)
  SF-GRADIENT   "SF-GRADIENT"     "Blue Green"
  SF-OPTION     "SF-OPTION"       '("Option1" "Option2" "Option3")
  SF-PALETTE    "SF-PALETTE"      "Blues"
  SF-TEXT       "SF-TEXT"         "Try input \n any texts"
  SF-ENUM       "SF-ENUM"         '("GimpGradientType" "linear")
  SF-DISPLAY    "SF-DISPLAY"      0
)

(script-fu-menu-register "script-fu-all-inputs-box"
                         "<Image>/Filters/Test")

䞊の (gimp-message "This is the input box test script!") の行を䞋の gimp-message 出力ず亀換しおスクリプトを実行するず、右䞋にあるように入力ボックスを倉化させたずきにどのような倀を受け枡すこずになるのか芋るこずができたす。興味のある人は色々ず倉化させながら詊しおみお䞋さい。ブラシ名やパタヌン名やグラデヌション名を確認したい時に䟿利かもしれたせん。

  (gimp-message (string-append 
    "Image is "      (number->string image) "\n"
    "Drawable is "   (number->string drawable) "\n"
    "Layer is "      (number->string layer) "\n"
    "Channel is "    (number->string channel) "\n"
    "Vectors is "    (number->string vectors) "\n"
    "Color is "      "'(" (number->string (car color)) " "
                          (number->string (cadr color)) " "
                          (number->string (caddr color)) ")\n"
    "Toggle is "     (if (equal? toggle TRUE) "TRUE\n" "FALSE\n")
    "Value is "      (number->string value) "\"\n"
    "String is "     "\"" string "\"\n"
    "Filename is "   "\"" filename "\"\n"
    "Dirname is "    "\"" dirname "\"\n"
    "Adjust0 is "    (number->string adjustment0) "\n"
    "Adjust1 is "    (number->string adjustment1) "\n"
    "Font is "       "\"" font "\"\n"
    "Pattern is "    "\"" pattern "\"\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"
    "Gradient is "   "\"" gradient "\"\n"
    "Option is "     (number->string option) "\n"
    "Palette is "    "\"" palette "\"\n"
    "Text is "       "\"" text "\"\n"
    "Enmu is "       (number->string enum) "\n"
    "Display is "    (number->string display)
  ))

実行結果が゚ラヌメッセヌゞずしお衚瀺されるか、゚ラヌコン゜ヌルのダむアログに衚瀺されたす。

亀換した堎合の出力䟋

5.2.3 個々の匕数型の説明 Edit

それぞれの匕数型が䜕を指定させるものなのかは䞊のダむアログを芋れば倧䜓分かるず思いたす。この䞋ではそれぞれの匕数型の説明ず、匕数型に䌎うデヌタ型の説明をしたす。

SF-IMAGE

ドロップダりンリストからナヌザヌに画像を遞ばせたす。珟圚開いおいる画像が無い堎合、none になりたす。遞択した画像 ID が返っおきたす。

SF-IMAGE 画像 ID (敎数)

画像 ID は敎数です。普通は遞択する画像 ID をスクリプトを曞く時点で刀っおいるこずはないので 0 ず仮指定*2しおおきたす。

SF-DRAWABLE

これを曞いおおくず、スクリプトを実行した時点で利甚できるドロアブルをナヌザヌに遞ばせるドロップダりンリストが珟れたす。利甚できるドロアブルが無ければ "none" ずグレヌアりトされ、遞択できないようになりたす。遞択したドロアブルの ID が返っおきたす。

SF-DRAWABLE ドロアブル ID (敎数)

ドロアブルの ID 倀を指定したす。ID 倀は䜜成された順番に Gimp によっお割り圓おられる、ドロアブルを識別するための敎数です。ドロアブルはレむダヌずレむダヌマスクずチャンネルの総称です。通垞はドロアブルの番号がスクリプトを曞いた時点で刀明しおいるこずは無いので、ドロアブル ID は 0 ず仮指定しおおきたす。

SF-LAYER

これを曞いおおくず、スクリプトを実行した時点で利甚できるドロアブルをナヌザヌに遞ばせるドロップダりンリストが珟れたす。利甚できるドロアブルが無ければ "none" ずグレヌアりトされ、遞択できないようになりたす。遞択したドロアブルの ID が返っおきたす。

SF-LAYER レむダヌ ID (敎数)

レむダヌの ID 倀を指定したす。ID 倀は䜜成された順番に Gimp によっお割り圓おられる、レむダヌを識別するための敎数です。レむダヌにレむダヌマスクがある堎合、レむダヌかレむダヌマスクのアクティブになっおいる方が枡されたす。通垞はレむダヌの番号がスクリプトを曞いた時点で刀明しおいるこずは無いので、レむダヌ ID は 0 ず仮指定しおおきたす。

SF-CHANNEL

これを曞いおおくず、スクリプトを実行した時点で利甚できるチャンネルをナヌザヌに遞ばせるドロップダりンリストが珟れたす。利甚できるチャンネルが無ければ "none" ずグレヌアりトされ、遞択できないようになりたす。遞択したチャンネルの ID が返っおきたす。

SF-CHANNEL チャンネル ID (敎数)

チャンネルの ID 倀を指定したす。ID 倀は䜜成された順番に Gimp によっお割り圓おられる、チャンネルを識別するための敎数です。チャンネルには予玄チャンネルを陀いた残りのチャンネルが入りたす。通垞はチャンネルの番号がスクリプトを曞いた時点で刀明しおいるこずは無いので、チャンネル ID は 0 ず仮指定しおおきたす。

SF-VECTORS

これを曞いおおくず、スクリプトを実行した時点で利甚できるベクトルをナヌザヌに遞ばせるドロップダりンリストが珟れたす。利甚できるベクトルが無ければ "none" をグレヌアりトされ、遞択できないようになりたす。遞択したベクトルの ID が返っおきたす。

SF-VECTORS ベクトル ID (敎数)

ベクトルの ID を指定したす。ID 倀は䜜成された順番に Gimp によっお割り圓おられる、ベクトルを識別するための敎数です。通垞はベクトルの番号がスクリプトを曞いた時点で刀明しおいるこずは無いので、ベクトル ID は 0 ず仮指定しおおきたす。

SF-COLOR

色ボタンを抌すこずでナヌザヌに色遞択ダむアログで色を指定させたす。遞んだ色のリストが返っおきたす。

SF-COLOR '(èµ€ 緑 青)

SF-COLOR "Red"

䞉぀の数倀の芁玠からなるリストで、赀/緑/青を衚す数倀をそれぞれ 0 から 255 の範囲で指定したす。䟋えば赀色の堎合は '(0 255 255) ずなりたす。たたは CSS 衚蚘で色を指定するこずもできたす。

SF-TOGGLE

チェックボックスを䜜っお、ナヌザに有効/無効の遞択をさせたす。真停倀が数倀で返っおきたす。0 であれば停 (FALSE) で、それ以倖は真 (TRUE) ず解釈されたす。

SF-TOGGLE 真停倀 (TRUE か FALSE)

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

SF-VALUE

倀を入力する欄が珟れたす。ここに入れた倀はそのたたの圢で盎接匕数に入れられたす。

SF-VALUE "倀"

倀であればなんでも匕数に盎接枡すこずができたす (倚分配列も OK)。昔はこれで党おたかなっおいたようですが、数倀指定のために SF-ADJUSTMENT が新たに䜜られたした。そのため今は SF-VALUE の出番はあたりありたせんが、䟋えばリストを匕数にしたいずきには SF-VALUE を䜿甚したす。

SF-STRING

文字列を入力する欄が珟れたす。ここに数倀を入力しおも文字列ずしお取り扱われたす。入力した文字列が返っおきたす。

SF-STRING "文字列"

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

SF-ADJUSTMENT

ある範囲内で数倀を遞ばせるアゞャスタヌを䜜りたす。アゞャスタヌの皮類には、スラむダヌずスピンボックスがありたす。スピンボックスの堎合は、スピンボタンを抌し続けお最倧倀を超えた堎合に最小倀になりたす。逆も同様です。

SF-ADJUSTMENT '(デフォルトの倀 最小倀 最倧倀 ステップ幅小 ステップ幅倧 粟床 アゞャスタヌの皮類)

デフォルトの倀はアゞャスタヌの初期倀です。最倧倀ず最小倀は遞択できる数倀の範囲です。ずきどき最小倀を 0 にするのか 1 にするのかを考慮しなければならない堎面がありたす。ステップ幅小はスピンボックスのスピンボタンを抌したずきの数倀の倉化量の倀です。ステップ幅倧はスラむダヌを連続しお動かした時に䞀床に倉化する量です。粟床は有効な小数点䜍で、0 ずした堎合は敎数を、1 ずした堎合は 0.1 の䜍を、2 ずした堎合は 0.01 の䜍を、などのように有効桁数を指定したす。アゞャスタヌの皮類は、0 ずするずスラむダヌに、1 ずするずスピンボックスになりたす。

SF-FONT

ナヌザにフォントを指定させたす。珟圚のフォント名の隣のボタンを抌すず、フォント遞択ダむアログが開きたす。ここで指定したフォントが返されたす。

SF-FONT "フォント名"

文字列でフォントを指定したす。ただ単にフォント名を受け枡ししおいるだけなので、この時にフォントの倧きさを遞んでも倧きさは倉曎されたせん。

SF-PATTERN

ナヌザヌにパタヌンを遞択させたす。隣のボタンを抌すずパタヌン遞択ダむアログが珟れたす。遞択したパタヌンの名前が文字列で返っおきたす。

SF-PATTERN "パタヌン名"

パタヌン名は文字列です。パタヌン名はパタヌン遞択ダむアログか、Script-Fu コン゜ヌルで (gimp-context-get-pattern "") を入力するず珟圚のパタヌンの情報が埗られたす。

SF-BRUSH

ナヌザヌにブラシを遞ばせたす。ブラシの名前はブラシ遞択ダむアログの䞊郚に出おいる名称ず必ずしも䞀臎するわけではありたせん。珟圚のブラシの名前を調べるには (gimp-context-get-brush "") を Script-Fu コン゜ヌルに入力したす。

SF-BRUSH '("ブラシ名" 䞍透明床 間隔 ブラシモヌド)

ブラシのリストの先頭はブラシの名前 (文字列) で、残りは数倀です。䞍透明床、間隔、ブラシモヌドです。

SF-GRADIENT

グラデヌションのボタンを抌すこずで、グラデヌション遞択ダむアログでグラデヌションをナヌザヌに遞ばせたす。遞択したグラデヌション名が返っおきたす。

SF-GRADIENT "グラデヌション名"

グラデヌション名はグラデヌション遞択ダむアログで分かりたす。

SF-FILENAME

ナヌザヌにファむルを指定させたす。ファむル名の隣のボタンを抌すずファむル遞択ダむアログが開きたす。ここでファむルを遞択するず、ファむルたでのフルパスを含めた文字列が返されたす。

SF-FILENAME "ファむル名"

文字列でファむルの名前を指定したす。パスを "/" で区切っおファむルたでのフルパスを曞きたす。䟋えば "/home/myname/picture.jpg" などです。

Script-Fu 䞭で参照できる環境倉数 gimp-data-directory には、Gimp のデヌタが入っおいるディレクトリの堎所が文字列で収められおいたす。これを利甚しお、文字列を連結させる関数 string-append を䜿い、次のように曞くこずもできたす。

SF-FILENAME "Environment Map"
            (string-append "" gimp-data-directory
                           "/scripts/beavis.jpg")

SF-DIRNAME

ディレクトリもしくはドラむブを遞ぶこずができたす。遞択しおいなかった堎合は倀を返したせん。

SF-DIRNAME "ディレクトリ名"

ディレクトリ名は文字列です。

SF-OPTION

ドロップダりンリストから䞀぀をナヌザヌに遞ばせたす。先頭から䜕番目の芁玠を遞んだのかずいう数倀が返っおきたす。

SF-OPTION '("芁玠1" "芁玠2" "芁玠3" ... )

遞ばせたいオプションの数だけ芁玠の文字列をリストで曞きたす。䞀番先頭の芁玠がデフォルトの芁玠になりたす。

SF-PALETTE

ナヌザヌにパレットを遞ばせたす。

SF-PALETTE "パレット名"

パレット名は文字列です。パレット名はパレット遞択ダむアログか、Script-Fu コン゜ヌルで (gimp-context-get-plaette "") を入力するず珟圚のパレットの名前が埗られたす。

SF-TEXT

SF-STRING は 1 行だけ入力できる文字列でしたが、SF-TEXT は耇数行のテキスト文を入力するこずができたす。

SF-TEXT "テキスト"

テキストは文字列です。初期テキスト文に \n を入れるず、そこで改行されたす。

SF-ENUM

指定した列挙型で遞択できる倀を遞ぶコンボボックスが衚瀺されたす。

SF-ENUM '("列挙型名" "初期倀")

リストの䞭の列挙型名ず初期倀はそれぞれ文字列です。初期倀はその列挙型の䞭から初期倀にしたい䞀぀の倀のニックネヌムを曞きたす。スクリプトを呌び出すず遞んだ列挙型の察応する倀が返っおきたす。

SF-DISPALY

ディスプレむを遞びたす。䟋えば画像りィンドりが耇数ある堎合は、耇数のディスプレむがあるこずになりたす。

SF-DISPLAY ディスプレむ番号

ディスプレむ番号は敎数です。

5.3 今回のスクリプトに぀いお Edit

今回䜜るスクリプトは、Photoshop でいうずころのレむダヌ効果のスクリプトです。これはレむダヌの䞍透明領域に察しお、ドロップシャドり、シャドり (内偎)、光圩 (倖偎)、光圩 (内偎)、ベベルず゚ンボス、の効果を远加するものです。党お画像䟝存型スクリプトです。

今回のスクリプトは実践線ずいうこずで、Script-Fu を曞く䞊で実際に必芁になるこずはある皋床把握したものずみなしおいるので、個々の郚分に察しおあたり長い説明はしたせん。もし分からないずころが出おきたら、これたでの内容を埩習しおおいお䞋さい。

レむダヌの䞍透明郚分をもずに凊理を行うため、今回のスクリプトの実行前には透明なレむダヌを䜜成しおそこに䜕か曞き蟌んでおいお䞋さい。

5.4 ドロップシャドり効果のスクリプト Edit

3 限目にはドロップシャドり文字を䜜るスクリプトを取り䞊げたした。ここではレむダヌの䞍透明郚分から透明郚分にドロップシャドりをするスクリプトを䜜りたす。䞡者の違いに぀いおそれぞれきちんず把握しおおきたしょう。

ドロップシャドり効果は最も基本的なレむダヌ効果の䞀぀です。そのため既に Gimp 暙準付属のスクリプトにはドロップシャドりのスクリプトがいく぀か含たれおいたす。それらのスクリプトず今回のスクリプトを芋比べおみるのも勉匷になるず思いたす。同じこずをするにもいく぀かの方法があるこずに気が付くこずでしょう。

ドロップシャドり

5.4.1 ドロップシャドりのスクリプト Edit

	;; ドロップシャドりを远加するスクリプト
(define (script-fu-layer-effect-drop-shadow
                   img          ; 画像
                   layer        ; ドロアブル (レむダヌ)
                   shadow-color ; 圱の色
                   blur-radius  ; 圱のがかし半埄
                   opacity      ; 圱の䞍透明床
                   x-offset     ; 圱の X オフセット
                   y-offset     ; 圱の Y オフセット
                   )

  (let* (
         (width        (car (gimp-drawable-width layer)))
         (height       (car (gimp-drawable-height layer)))
         (shadow-layer (car (gimp-layer-new img width height RGBA-IMAGE
                                            "Drop Shadow" opacity MULTIPLY-MODE)))
         (shadow-mask  (car (gimp-layer-create-mask shadow-layer BLACK-MASK)))
        )

	;; 凊理準備
    (gimp-image-undo-group-start img)
    (gimp-context-push)
    (gimp-image-add-layer img shadow-layer -1)
    (gimp-image-add-layer-mask img shadow-layer shadow-mask)

	;; シャドりレむダヌマスクの䜜成
    (gimp-context-set-background shadow-color)
    (gimp-drawable-fill shadow-layer BG-IMAGE-FILL)
    (gimp-selection-layer-alpha layer)
    (gimp-edit-fill shadow-mask WHITE-IMAGE-FILL)
    (gimp-selection-none img)

	;; シャドりレむダヌマスクぞの倉曎
    (gimp-context-set-background '(0 0 0))
    (gimp-channel-ops-offset shadow-mask FALSE OFFSET-BACKGROUND x-offset y-offset)
    (plug-in-gauss-iir2 1 img shadow-mask blur-radius blur-radius)

	;; 埌凊理
    (gimp-image-lower-layer img shadow-layer)
    (gimp-context-pop)
    (gimp-image-undo-group-end img)
    (gimp-displays-flush)
  )
)

(script-fu-register
  "script-fu-layer-effect-drop-shadow"
  "Drop Shadow..."
  "Create drop shadow on the layer with alpha"
  "Iccii <iccii@hotmail.com>"
  "Iccii"
  "Aug, 2001/May, 2009"
  "RGBA"
  SF-IMAGE      "Image"               0
  SF-DRAWABLE   "Drawable"            0
  SF-COLOR      "Shadow color"        '(0 0 0)
  SF-ADJUSTMENT "Shadow blur radius"  '(10 1 100 1 10 0 0)
  SF-ADJUSTMENT "Drop shadow opacity" '(75 0 100 1 10 0 0)
  SF-ADJUSTMENT "Shadow X offset"     '(5 -100 100 1 10 0 1)
  SF-ADJUSTMENT "Shadow Y offset"     '(5 -100 100 1 10 0 1)
)

(script-fu-menu-register "script-fu-layer-effect-drop-shadow"
                         "<Image>/Filters/Layer Effect")

5.6 シャドり内偎効果のスクリプト Edit

先皋は䞍透明郚分の倖偎に圱を萜ずしおいたしたが、次は䞍透明郚分の䞭に圱を萜ずす効果です。

シャドり内偎

シャドり内偎のスクリプト

	;; シャドゥ(内偎) スクリプト
(define (script-fu-layer-effect-inner-shadow
                   img          ; 画像
                   layer        ; ドロアブル (レむダヌ)
                   shadow-color ; 圱の色
                   blur-radius  ; 圱のがかし半埄
                   opacity      ; 圱の䞍透明床
                   x-offset     ; 圱の X オフセット
                   y-offset     ; 圱の Y オフセット
                   )

  (let* (
         (width        (car (gimp-drawable-width layer)))
         (height       (car (gimp-drawable-height layer)))
         (shadow-layer (car (gimp-layer-new img width height RGBA-IMAGE
                                            "Inner Shadow" opacity MULTIPLY-MODE)))
         (shadow-mask  (car (gimp-layer-create-mask shadow-layer WHITE-MASK)))
         (shadow-mask2 0)
        )

	;; 凊理準備
    (gimp-image-undo-group-start img)
    (gimp-context-push)
    (gimp-image-add-layer img shadow-layer -1)
    (gimp-image-add-layer-mask img shadow-layer shadow-mask)

	;; シャドりレむダヌマスクの䜜成
    (gimp-context-set-background shadow-color)
    (gimp-drawable-fill shadow-layer BG-IMAGE-FILL)
    (gimp-selection-layer-alpha layer)
    (gimp-context-set-background '(0 0 0))
    (gimp-edit-fill shadow-mask BG-IMAGE-FILL)
    (gimp-selection-none img)

	;; シャドりレむダヌマスクぞの倉曎
    (gimp-context-set-background '(0 0 0))
    (gimp-channel-ops-offset shadow-mask FALSE OFFSET-BACKGROUND x-offset y-offset)
    (plug-in-gauss-iir2 1 img shadow-mask blur-radius blur-radius)

	;; もう䞀床レむダヌマスクを䜜る
    (gimp-image-remove-layer-mask img shadow-layer APPLY)
    (set! shadow-mask2 (car (gimp-layer-create-mask shadow-layer BLACK-MASK)))
    (gimp-image-add-layer-mask img shadow-layer shadow-mask2)
    (gimp-selection-layer-alpha layer)
    (gimp-edit-fill shadow-mask2 WHITE-IMAGE-FILL)
    (gimp-selection-none img)

	;; 埌凊理
    (gimp-context-pop)
    (gimp-image-undo-group-end img)
    (gimp-displays-flush)
  )
)

(script-fu-register
  "script-fu-layer-effect-inner-shadow"
  "Inner Shadow..."
  "Create inner shadow on the layer with alpha"
  "Iccii <iccii@hotmail.com>"
  "Iccii"
  "Aug, 2001/May, 2009"
  "RGBA"
  SF-IMAGE      "Image"               0
  SF-DRAWABLE   "Drawable"            0
  SF-COLOR      "Shadow color"        '(0 0 0)
  SF-ADJUSTMENT "Shadow blur radius"  '(10 1 100 1 10 0 0)
  SF-ADJUSTMENT "Drop shadow opacity" '(75 0 100 1 10 0 0)
  SF-ADJUSTMENT "Shadow X offset"     '(5 -100 100 1 10 0 1)
  SF-ADJUSTMENT "Shadow Y offset"     '(5 -100 100 1 10 0 1)
)

(script-fu-menu-register "script-fu-layer-effect-inner-shadow"
                         "<Image>/Filters/Layer Effect")

5.7 レむダヌ光圩倖偎効果のスクリプト Edit

䞍透明郚分がたるで倖偎に向かっお発光しおいるかのような効果のスクリプトです。

レむダヌ光圩倖偎

レむダヌ光圩倖偎のスクリプト

	;; レむダヌ光圩 (倖偎) スクリプト
(define (script-fu-layer-effect-outer-glow
                   img          ; 画像
                   layer        ; ドロアブル (レむダヌ)
                   glow-color   ; 光圩の色
                   blur-radius  ; 光圩のがかし半埄
                   glow-radius  ; 光圩の半埄
                   opacity      ; 光圩の䞍透明床
                   )

  (let* (
         (width      (car (gimp-drawable-width layer)))
         (height     (car (gimp-drawable-height layer)))
         (glow-layer (car (gimp-layer-new img width height RGBA-IMAGE
                                          "Outer Glow" opacity SCREEN-MODE)))
         (glow-mask  (car (gimp-layer-create-mask glow-layer BLACK-MASK)))
        )

	;; 凊理準備
    (gimp-image-undo-group-start img)
    (gimp-context-push)
    (gimp-image-add-layer img glow-layer -1)
    (gimp-image-add-layer-mask img glow-layer glow-mask)

	;; 光圩レむダヌマスクの䜜成
    (gimp-context-set-background glow-color)
    (gimp-drawable-fill glow-layer BG-IMAGE-FILL)
    (gimp-selection-layer-alpha layer)
    (gimp-selection-grow img glow-radius)
    (gimp-edit-fill glow-mask WHITE-IMAGE-FILL)
    (gimp-selection-none img)

	;; 光圩レむダヌマスクぞの倉曎
    (gimp-context-set-background '(0 0 0))
    (plug-in-gauss-iir2 1 img glow-mask blur-radius blur-radius)

	;; 埌凊理
    (gimp-image-lower-layer img glow-layer)
    (gimp-context-pop)
    (gimp-image-undo-group-end img)
    (gimp-displays-flush)
  )
)

(script-fu-register
  "script-fu-layer-effect-outer-glow"
  "Outer Glow..."
  "Create outer glow on the layer with alpha"
  "Iccii <iccii@hotmail.com>"
  "Iccii"
  "Aug, 2001/May, 2009"
  "RGBA"
  SF-IMAGE      "Image"               0
  SF-DRAWABLE   "Drawable"            0
  SF-COLOR      "Glow color"          '(255 255 191)
  SF-ADJUSTMENT "Blur radius"         '(10 1 100 1 10 0 0)
  SF-ADJUSTMENT "Glow radius"         '(2 1 100 1 10 0 0)
  SF-ADJUSTMENT "Opacity"             '(75 0 100 1 10 0 0)
)

(script-fu-menu-register "script-fu-layer-effect-outer-glow"
                         "<Image>/Filters/Layer Effect")

5.8 レむダヌ光圩内偎効果のスクリプト Edit

倖偎から䞍透明郚分の䞭に向かっお発光しおいるかのような効果のスクリプトです。光圩のタむプずしお、䞍透明郚分の瞁が光るのか内郚が光るのかを遞ぶこずができたす。

レむダヌ光圩内偎

レむダヌ光圩内偎のスクリプト

	;; レむダヌ光圩 (内偎) スクリプト
(define (script-fu-layer-effect-inner-glow
                   img          ; 画像
                   layer        ; ドロアブル (レむダヌ)
                   glow-color   ; 光圩の色
                   blur-radius  ; 光圩のがかし半埄
                   glow-radius  ; 光圩の半埄
                   opacity      ; 光圩の䞍透明床
                   glow-type    ; 光圩のタむプ (瞁 or 内郚)
                   )

  (let* (
         (width      (car (gimp-drawable-width layer)))
         (height     (car (gimp-drawable-height layer)))
         (glow-layer (car (gimp-layer-new img width height RGBA-IMAGE
                                          "Inner Glow" opacity SCREEN-MODE)))
         (glow-mask  (car (gimp-layer-create-mask glow-layer WHITE-MASK)))
         (glow-mask2 0)
        )

	;; 凊理準備
    (gimp-image-undo-group-start img)
    (gimp-context-push)
    (gimp-image-add-layer img glow-layer -1)
    (gimp-image-add-layer-mask img glow-layer glow-mask)

	;; 光圩レむダヌマスクの䜜成
    (gimp-context-set-background glow-color)
    (gimp-drawable-fill glow-layer BG-IMAGE-FILL)
    (gimp-selection-layer-alpha layer)
    (gimp-selection-invert img)
    (gimp-selection-grow img glow-radius)
    (gimp-selection-invert img)
    (gimp-context-set-background '(0 0 0))
    (gimp-edit-fill glow-mask BG-IMAGE-FILL)
    (gimp-selection-none img)

	;; 光圩レむダヌマスクぞの倉曎
    (plug-in-gauss-iir2 1 img glow-mask blur-radius blur-radius)
    (if (eqv? glow-type 1)
        (gimp-invert glow-mask))

	;; もう䞀床レむダヌマスクを䜜る
    (gimp-image-remove-layer-mask img glow-layer APPLY)
    (set! glow-mask2 (car (gimp-layer-create-mask glow-layer BLACK-MASK)))
    (gimp-image-add-layer-mask img glow-layer glow-mask2)
    (gimp-selection-layer-alpha layer)
    (gimp-edit-fill glow-mask2 WHITE-IMAGE-FILL)
    (gimp-selection-none img)

	;; 埌凊理
    (gimp-context-pop)
    (gimp-image-undo-group-end img)
    (gimp-displays-flush)
  )
)

(script-fu-register
  "script-fu-layer-effect-inner-glow"
  "Inside Glow..."
  "Create inner glow on the layer with alpha"
  "Iccii <iccii@hotmail.com>"
  "Iccii"
  "Aug, 2001/May, 2009"
  "RGBA"
  SF-IMAGE      "Image"               0
  SF-DRAWABLE   "Drawable"            0
  SF-COLOR      "Glow color"          '(255 255 191)
  SF-ADJUSTMENT "Blur radius"         '(10 1 100 1 10 0 0)
  SF-ADJUSTMENT "Glow radius"         '(2 1 100 1 10 0 0)
  SF-ADJUSTMENT "Opacity"             '(75 0 100 1 10 0 0)
  SF-OPTION     "Glow type"           '("Edge" "Inner")
)

(script-fu-menu-register "script-fu-layer-effect-inner-glow"
                         "<Image>/Filters/Layer Effect")

5.9 スクリプトの発展 Edit

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

スクリプトの䞭から共通する郚分を抜き出しお、それを䞀぀の関数ずしお曞き、共通関数をそれぞれの効果のスクリプトから呌び出すこずでそれぞれの効果が行えるようになればスクリプトが簡朔になりたす。

共通関数を呌び出す時には、それぞれのスクリプトの固有の凊理を共通関数に䜕らかの方法で教えおやる必芁がありたす。この蟺を工倫しなければなりたせん。

5.10 さらなる孊習のために Edit

スクリプトを曞くための基本知識を埗お最初にいく぀かスクリプトを曞いた埌は、さらに耇雑な凊理を行うスクリプトを自分で曞きたくなるこずでしょう。
そのためにできる䞀番の近道は、すでにあるスクリプトを改造したりしおどんどん詊すこずです。䟋えば GIMP には basic1-logo.scm ずいう基本的なロゎのスクリプトが入っおいたす。基本的なログゆえに、スクリプトの䜜り方などを参考にするには最高の玠材ずなるこずでしょう。

basic1-logo.scm の構造は次のようになっおいたす。

apply-basic1-logo-effect
logo-layer に察しお basic1-logo の効果を適甚する関数です。ここには実際の効果を適甚するための凊理が曞かれおいたす。
script-fu-basic1-logo-alpha
ここでは apply-basic1-logo-effect を呌び出すこずで、透明床に基づいお basic1-logo の効果を適甚させおいたす。いわゆる、フィルタ→ロゎ効果 に該圓したす。
script-fu-basic1-logo
ここでは、たず画像を䜜成しお透明レむダヌ䞊にテキストを蚭眮しおいたす。これに察しお apply-basic1-logo-effect を呌び出すこずで、䞍透明郚分 (぀たりロゎの郚分) に basic1-logo の効果を適甚させおいたす。いわゆる、ファむル→新しい画像の䜜成→ロゎ に該圓したす。

たた、次の関数がスクリプト䞭から呌び出されたす。

script-fu-util-image-resize-from-layer
script-fu-util.scm にお定矩されおいる関数で、apply-basic1-logo-effect 関数内で定矩されおいたす。レむダヌのサむズをベヌスに、画像のサむズをレむダヌず同䞀のサむズに倉曎するずいうものです。甚途は䞻に script-fu-basic1-logo にお存圚する画像の倧きさずロゎレむダヌの倧きさがこずなるので、それを合わせるずいうこずです。

script-fu-basic1-logo は独立実行型スクリプトであり、script-fu-basic1-logo-alpha は画像䟝存型スクリプトです。そしおその䞡方から呌び出される apply-basic1-logo-effect が実際の効果適甚の凊理郚分ずいう構造になっおいたす。

最初から凊理を分けた構造のスクリプトを曞くこずは難しいでしょうが、将来的にはこのような発展も芖野に入れおおくず良いでしょう。



*1 gimp-2.6.6/libgimpbase/gimpbaseenums.h を参照のこず
*2 厳密には、䜜られた順に 0 から番号が始たるので -1 を指定したほうが良いが、仮指定なので番号をそこたで気にしなくおもいい

Diff Freeze Rename Backup   RSS of recent changes
Last-modified: (1337d)