Top > ScriptFuClass > Step3

䞉限目 最初のスクリプト Edit

これで最䜎限必芁な Scheme の説明が終わり、最初のスクリプトを曞くこずができるようになりたした。最初のスクリプトは非垞にシンプルです。しかしずおも重芁な意味を持っおいたす。たずはレむダヌを耇補するスクリプトず新芏画像を䜜るスクリプトを䜜っおみたしょう。

3.1 画像䟝存型ず独立実行型 Edit

スクリプトには倧きく分けお独立実行型のスクリプトず画像䟝存型のスクリプトの二皮類がありたす。

3.1.1 画像䟝存型 Edit

画像䟝存型のスクリプトは、スクリプトの実行に画像 (やレむダヌ等) を必芁ずする凊理を行うスクリプトです。レむダヌに察しお䜕らかの操䜜を行うものがそうです。このタむプのスクリプトはメニュヌのさたざたな堎所に眮かれおいたす。

3.1.2 独立実行型 Edit

独立実行型のスクリプトは、スクリプトの実行に画像を必芁ずしないスクリプトです。画像を自前で䜜り䞊げおしたうものが倚いです。このタむプのスクリプトは䞻に ファむル/画像の䜜成/{ボタン|ロゎ|パタヌン|Web ペヌゞテヌマの䜜成} の䞋に眮かれおいたす。

この次では画像䟝存型スクリプトず独立実行型の簡単な䟋ずしお、最も基本的なスクリプトを䜜りたす。
画像䟝存型の䟋ずしお、レむダヌを耇補するスクリプトを挙げたす。そしお独立実行型の䟋ずしおは、新芏画像を䜜成するスクリプトを挙げたす。

3.2 プロシヌゞャブラりザ Edit

ヘルプ/プロシヌゞャブラりザ... にある プロシヌゞャブラりザでは、Gimp のプロトコルデヌタベヌスに登録されおいお Script-Fu から呌び出しお利甚するこずができる関数を怜玢するこずができたす。

3.2.1 プロシヌゞャブラりザの䜿い方 Edit

Script-Fu を曞く時で Gimp の機胜を䜕か䜿いたいずき、プロシヌゞャブラりザからお目圓おの機胜を行う関数を探しお、入力ずしお必芁な匕数 (あれば出力も) を確認するこずができたす。スクリプトを䜜成した堎合も、関数の䞀぀ずしおそのスクリプトがデヌタベヌスに登録されたす。

関数を探す時は、怜玢欄に探したいタヌゲットのキヌワヌドを入力するだけです。するずキヌワヌドに䞀臎する関数だけが巊偎に残りたす。この䞋は "new" で怜玢した結果です。

gimp-layer-new の入出力

巊偎から䜕か䞀぀関数を遞ぶず、その関数に関する情報が右偎に衚瀺されたす。その関数の説明ず、(あれば) 党おの入力の匕数ず、党おの出力の匕数に぀いおの情報ず、ヘルプずその他の著䜜暩情報などです。ヘルプにはその関数を䜿う䞊で重芁な情報が詳しく曞かれおいるので、はじめお䜿う関数の時には䞀床目を通しおおくようにしたしょう。

Script-Fu を曞く時には、基本的にこのプロシヌゞャブラりザで関数を探しながら曞くこずになりたす。そのため次の䜜業の繰り返しでスクリプトを曞くこずになりたす。

䜿いたい・欲しい機胜 (関数) がある

    ↓

プロシヌゞャブラりザで探す

    ↓

入力/出力の匕数を芋る

    ↓

スクリプトに曞く

    ↓

次の関数ぞ (最初に戻る)

怜玢したいキヌワヌドが分からない堎合は、Gimp を英語モヌドで起動するずツヌルやコマンドが英語衚瀺になるので分かりやすいでしょう。英語モヌドで起動するには環境倉数「lang」を「en」に蚭定したす。環境倉数の蚭定方法は䜿甚しおいる OS により異なるので該圓サむトを参照しおください。

3.2.2 プロシヌゞャブラりザで衚瀺される匕数型 Edit

プロシヌゞャブラりザの右偎の入力パラメヌタ/出力返り倀のずころでは、匕数ずしお期埅されおいる型が衚瀺されおいたす。スクリプトを曞く堎合には、間違った型の倀を䞎えないようにしたしょう。もし匕数の型を間違えるず、スクリプトを実行したずきに゚ラヌずなりたす。

この䞋には匕数型の説明がありたすが、はじめお読む堎合は読み飛ばしおしたっおも構いたせん。埌で読む必芁が出おきたずきに参照する皋床でよいでしょう。

ARRAY (FLOATARRAY/INT8ARRAY/INT32ARRAY/STRINGARRAY)
配列です。配列の型によっお、小数点型、8/32 ビット敎数型、文字列型に分かれたす。
CHANNEL
チャンネルです。リストになっおおり、先頭の芁玠はチャンネルの ID です。チャンネルマスクやクむックマスクも CHANNEL ずしお扱われたす。
COLOR
色です。RGB の䞉芁玠の数倀が入ったリストになりたす。
DISPLAY
䜜成した IMAGE を実際に画像りィンドりに衚瀺するずきに関係したす。
DRAWABLE
ドロアブルです。ドロアブルはレむダヌずチャンネルの総称です。リストになっおおり、先頭の芁玠はドロアブルの ID です。
FLOAT
(浮動) 小数点です。敎数であっおも 127.000000 のように小数点の有効桁たで付けお受け枡しを行いたす。
IMAGE
画像です。リストになっおおり、先頭の芁玠は画像の ID です。
INT32
32 ビット型の敎数です。取り埗る数倀の範囲が決たっおいる堎合があるので、DB ブラりザに曞いおある説明を読んでおきたしょう。
LAYER
レむダヌです。リストになっおおり、先頭の芁玠はレむダヌの ID です。
PARASITE
パラサむトです。パラサむトを利甚するず drawable などのタヌゲットに察しお情報を付加するこずができたす。
SELECTION
遞択領域です。リストに䞀぀だけ芁玠が入っおおり、遞択領域の ID (敎数) がありたす。
STRING
文字列です。文字列は二重匕甚笊 (") で前埌を囲たなくおはいけたせん。䟋えば文字列 string は "string" のようにしたす。二重匕甚笊 " 自身を出力するにぱスケヌプ蚘号 \ で \" のように゚スケヌプしたす。
VECTOR
ベクトル情報です。INT32 型の敎数ずしお収められたす。

3.3 レむダヌを耇補するスクリプト Edit

ようやく最初の Script-Fu を曞く䜜業です。このレむダヌを耇補するスクリプトは、耇補元のレむダヌを必芁ずする画像䟝存型のスクリプトです。

ここでは Scheme に぀いお色々ず説明する前に、レむダヌを耇補するだけずいう非垞にシンプルな Script-Fu を曞いおしたいたす。それからスクリプトがどのような構成になっおいるのかを説明したす。

3.3.1 曞いたスクリプトを眮く Edit

最初のスクリプトをぱっず芋ただけでは、ただ䜕がどうなっおいるのか分からないでしょう。ずりあえずこのスクリプトを、Unix ナヌザヌは Emacs 等の゚ディタで、Windows ナヌザヌはメモ垳などを䜿っお入力しお䞋さい。入力したファむルは、ファむル名ずしお duplicate-layer.scm などずしお保存しお䞋さい。

この保存した duplicate-layer.scm を、あなたの個人甚の scripts ディレクトリに入れたす。Unix ナヌザヌず Windows ナヌザヌの堎合ではそれぞれこのようになりたす。

  • Unix:

    $ cp duplicate.scm ~/.gimp-2.6/scripts/

  • Windows:

    duplicate.scm ファむルを C:\Documents and Settings\(ナヌザヌ名)\.gimp-2.6\scripts フォルダに入れる

3.3.2 レむダヌ耇補のスクリプト Edit

(define (script-fu-duplicate-layer img layer)
  (let* (
         (copy-layer (car (gimp-layer-copy layer TRUE)))
        )
    (gimp-image-add-layer img copy-layer -1)
    (gimp-displays-flush)
  )
)

(script-fu-register
  "script-fu-duplicate-layer"
  "Duplicate Layer..."
  "description"
  "name"
  "copyright"
  "date"
  "RGB*"
  SF-IMAGE     "Image"     0
  SF-DRAWABLE  "Drawable"  0)

 (script-fu-menu-register "script-fu-duplicate-layer"
                          "<Image>/Filters/Test")

3.3.3 スクリプトを動かす Edit

それでは䞊のスクリプトの説明に入りたす。新しいスクリプトを scripts ディレクトリにコピヌしたら、Gimp を起動しお䞋さい。自動的にこのスクリプトが読み蟌たれたす。もし既に Gimp が起動しおいる状態でスクリプトをコピヌしたのなら、新しいスクリプトを Gimp に読み蟌たせるため フィルタ/Script-Fu/スクリプトを再読み蟌み... をしおおいお䞋さい。スクリプトの䞀郚を曞き換えお、その倉曎を反映させたいずきにもスクリプトを再読み蟌みさせるず反映できたす。

さっそく䜜成したスクリプトを動かしおみたしょう。フィルタ/Test/Duplicate Layer... のメニュヌパスに今回新しく䜜ったスクリプトが登録されおいるず思いたす。これを䜿うず、レむダヌが耇補されたす (レむダヌダむアログで確認しお䞋さい)。ちょうどレむダヌダむアログの耇補ボタンを抌したずきず同じ動䜜ですね。

3.3.4 䞭でやっおいるこず Edit

なぜこのようになるのか、スクリプトでやっおいるこずに぀いお説明したす。順番が逆になっおしたいたすが、最埌の方から芋おいきたしょう。(先頭の数字は、このスクリプトの空癜行も含んだ最初の方からの通し行番号です)

スクリプトの登録

10| (script-fu-register
11|   "script-fu-duplicate-layer"
12|   "Duplicate Layer..."
13|   "description"
14|   "name"
15|   "copyright"
16|   "date"
17|   "RGB*"
18|   SF-IMAGE     "Image"     0
19|   SF-DRAWABLE  "Drawable"  0)
20|
21| (script-fu-menu-register "script-fu-duplicate-layer"
22|                          "<Image>/Filters/Test")

script-fu-register から始たっおいるこの 10 行目から 19 行目たでの郚分は、script-fu-duplicate-layer ずいう関数を Gimp ぞ登録しおいたす。21 行目ず 22 行目では script-fu-duplicate-layer ずいう関数をメニュヌに登録しおいたす。

script-fu-register による Gimp ぞの登録は、基本的に党おのスクリプトにずっお必須です。11 行目はこのスクリプトを Gimp で登録する時に指定する名前で、すでに䜿甚枈みではない名前を自分で自由に蚭定するこずができたす。ただし Script-Fu のスクリプトの堎合は "script-fu-" に続けおスクリプトの名前を付けるのが慣䟋ずなっおいたす。

12 行目はこのスクリプトのコマンドのメニュヌでの衚瀺名を曞きたす。

13 行目はこのスクリプトの説明を曞きたす。

14 行目はこのスクリプトの著䜜暩情報を曞きたす。

15 行目はこのスクリプトを䜜成した日付を曞きたす。これらはそれぞれアルファベットで蚘述し、プロシヌゞャブラりザ... で芋たずきに右偎に衚瀺される情報ずなりたす。

17 行目はこのスクリプトがどの画像モヌドで䜿甚できるのかずいう蚭定です。RGB* ずなっおいるのは、RGB モヌドず RGBA モヌドの䞡方で䜿えるこずを瀺しおいたす。RGB モヌドだけをここで指定した堎合、レむダヌにアルファチャンネルがあったずきにこのスクリプトを䜿うこずができたせん。モヌド指定は RGB(RGBA) のほかに、GRAY(GRAYA)、INDEXED(INDEXEDA) があり、それぞれグレヌスケヌルずむンデックスモヌドになりたす。スクリプトが察象ずするモヌドに合わせお指定したしょう

ここから埌はスクリプト本䜓に枡す匕数になりたす。18 行目ず 19 行目はそれぞれむメヌゞずドロアブルを取っおくるずいう指定です。画像䟝存型スクリプトの堎合、SF-IMAGE "Image" 0 ず SF-DRAWABLE "Drawable" 0 の二぀は必ず必芁になりたす。これを曞いおおくず、その時アクティブ*1になっおいる画像 (画像りィンドりから芋える画像ず考えるず分かりやすいかな) ず、その時アクティブになっおいるドロアブル (この堎合はレむダヌです) の二぀をスクリプト本䜓に枡すこずができたす。

21 行目ず 22 行目はスクリプトをメニュヌに配眮するための登録をやっおいるずころです。"Duplicate Layer..." のコマンドをメニュヌのどの䜍眮に眮くのかずいうもので、画像䟝存型スクリプトの堎合は <Image> からメニュヌパスを曞きはじめるタむプが倚くなりたす。

スクリプト本䜓の呌び出し

 1| (define (script-fu-duplicate-layer img layer) 

1 行目、ここからスクリプトの本䜓が始たりたす。この行は script-fu-duplicate-layer ずいう名前の関数を定矩しおいたす。この名前はスクリプトの登録した時に 11 行目で付けた名前ず同じにしなければならず、この名前の関数がスクリプトを実行した時に呌び出されるこずになりたす。

この呌び出しに続けお img ず layer ずいうものがありたす。これは䜕かずいうず、前述の SF-IMAGE ず SF-DRAWABLE で取っおきた画像の情報ずドロアブル (レむダヌ) の情報がそれぞれの倉数に入っおいるのです。そのためスクリプトの䞭でアクティブな画像を取り扱いたい時は img を、レむダヌを扱いたいずきは layer を䜿えばいいこずになりたす。

本䜓の䜜業

 2|  (let* (
 3|         (copy-layer (car (gimp-layer-copy layer TRUE)))
 4|        )
 5|    (gimp-image-add-layer img copy-layer -1)
 6|    (gimp-displays-flush)
 7|  )
 8|)

スクリプト本䜓を呌び出したら、次は本䜓内郚で行う䜜業を曞きたす。䜜業を党お曞き終えたら、1行目で呌び出した (define 文の括匧を閉じなければならないので、8 行目で括匧閉じ ")" を曞いおこのスクリプトを終えおいたす。぀たり 1 行目の (define (script-fu-duplicate-layer img layer) の終わりは 8 行目で、1 行目から 8 行目のこの間が実際に今回のスクリプトの凊理を行っおいるずころです。

2 行目は局所倉数を䜿甚するため let* 構文を䜿っおいたす。ここで䜿甚しおいる局所倉数は copy-layer の䞀぀だけです。局所倉数の宣蚀は 3 行目で行っおおり、4 行目の閉じ括匧はここで let* 構文の倉数宣蚀郚分が終わりであるこずを瀺す閉じ括匧です。

3 行目はレむダヌをコピヌしおいたす。今パッず芋ただけでは、なぜ car を䜿っお (car はリストの先頭の芁玠を取り出すこずを思い出しお䞋さい)、それを copy-layer に入れおいるのか分からないでしょう。

ここので重芁なのは、(gimp-layer-copy layer TRUE) では䜕が返っおくるのかずいうこずです。ヘルプ/Script-Fu/プロシヌゞャブラりザ... を開いおみお䞋さい。これはレむダヌをコピヌする関数で、この関数を探すために怜玢欄に copy ず入力しお怜玢するず䞋のようになりたす。

copy の怜玢結果

するず Gimp に登録されおいる関数で copy ずいうキヌワヌドに䞀臎するものがリストアップされたす。ここから gimp-layer-copy ずいうのがレむダヌをコピヌする関数だず予想が぀きたす。これを芋おみるず、入力に layer ず add-alpha の二぀のパラメヌタが必芁で、出力は layer-copy だずいうこずが分かりたす。

layer ずいうのは 1 行目の define で出おきた layer に入っおいる数倀をそのたた䜿いたす。add-alpha はレむダヌにアルファチャンネルを远加するかどうかで、ここでは TRUE ずしおおきたす。

そしおなぜ 3 行目で car を䜿うのかずいう理由は、gimp-layer-copy で layer をコピヌした結果はリストで返っおくるからです。そのリストの先頭にはコピヌしたレむダヌの ID 番号が入っおいたす。この ID 番号を取り出しお copy-layer に入れるこずで、次回からは copy-layer をコピヌしたレむダヌずしお扱うこずができるようになりたす。

これでレむダヌをコピヌしたものが手に入ったのですが、ただコピヌしたレむダヌは実際のレむダヌスタックには珟れおいたせん。単にコピヌしたレむダヌが Gimp 内郚で䜜られただけなので、レむダヌ階局にコピヌしたレむダヌを远加する必芁がありたす。layer で怜玢するず、gimp-image-add-layer が芋付かりたす。

layer で怜玢した結果

これには入力パラメヌタずしお image ず layer ず position を必芁ずしたす。この関数は画像 image にレむダヌ layer を远加するずいう意味ですから、image には define 行で出おくる img を、layer にはコピヌしたレむダヌを指す copy-layer を䜿いたす。position はレむダヌスタックのどこに眮くのかずいう䜍眮を指定するもので、-1 を指定するず珟圚アクティブになっおいるレむダヌの䞊にレむダヌが远加されたす。0 を指定するず匷制的にレむダヌスタックの䞀番䞊に远加されたす。

(gimp-displays-flush) ずいうのは、衚瀺を曎新するための決たり文句です。ここではレむダヌをコピヌしお远加したので衚瀺に倉化がありたす。5 行目が無ければこの倉化が実際の衚瀺に反映されたせん。スクリプト本䜓の最埌には必ず曞くようにしたしょう。

8 行目の ) の閉じ括匧は (define に察応する括匧です。ここでスクリプトの本䜓が終わりたす。忘れずに閉じるようにしたしょう。

3.4 画像を䜜成するスクリプト Edit

次は新芏画像を䜜成するスクリプトを䜜っおみたす。このスクリプトは無から画像を産み出す独立実行型のスクリプトですです。䞋のスクリプトを、先ほどのスクリプトず同じ芁領でファむルに曞き、scripts ディレクトリに入れおスクリプトを再読み蟌みしお䞋さい。

3.4.1 画像䜜成のスクリプト Edit

(define (script-fu-create-new-image bg-color width height)

  (let* (
         (img    (car (gimp-image-new width height RGB)))
         (layer  (car (gimp-layer-new img width height RGB-IMAGE
                                      "Background" 100 NORMAL-MODE)))
        )

    (gimp-context-push)

    (gimp-context-set-background bg-color)
    (gimp-drawable-fill layer BG-IMAGE-FILL)
    (gimp-image-add-layer img layer -1)

    (gimp-context-pop)
    (gimp-display-new img)
    (gimp-displays-flush)
))

(script-fu-register
 "script-fu-create-new-image"
 "New Image..."
 "description"
 "name"
 "copyright"
 "date"
 ""
 SF-COLOR      "Background color"  '(255 255 255)
 SF-ADJUSTMENT "Width"             '(256 1 1024 1 10 0 1)
 SF-ADJUSTMENT "Height"            '(256 1 1024 1 10 0 1))

(script-fu-menu-register "script-fu-create-new-image"
                         "<Image>/Filters/Test")

これは フィルタ/Test/New Image... にありたす。これを呌び出すず䞋のようなダむアログが珟れたす。実行するず、背景色で指定した色の背景レむダヌを持ち、倧きさが幅ず高さで指定したサむズのレむダヌが珟れるでしょう。

New Image ダむアログ

このスクリプトは先ほどのスクリプトよりも長いので、入力のミスなどでスクリプトの実行䞭に゚ラヌを返されたりするかもしれたせん。再読み蟌みをした時に゚ラヌを返される堎合は、開き括匧ず閉じ括匧が正しく察応しおいない時が倚いようです。䞀文字䞀文字が間違っおいないかよく確かめお䞋さい。

3.4.2 䞭でやっおいるこず Edit

スクリプトの登録

20| (script-fu-register
21|  "script-fu-create-new-image"
22|  "New Image..."
23|  "description"
24|  "name"
25|  "copyright"
26|  "date"
27|  ""

今回のスクリプトの関数の名前は create-new-image にしたした。これが 21 行目です。22 行目でメニュヌ䞊でのコマンド名を指定しおいたす。23、24、25、26 行は前回ず同じく、スクリプトの説明ず䜜者の名前ずスクリプトの著䜜暩衚瀺ずスクリプトを䜜成した日付です。27 行目には䜕も指定がありたせんが、これはこのスクリプトがれロの状態から画像を䜜成する独立実行型のため、察象ずするむメヌゞの型を指定をする必芁が無いのです。

匕数入力ボックスの䜜成

28|  SF-COLOR      "Background color"  '(255 255 255)
29|  SF-ADJUSTMENT "Width"             '(256 1 1024 1 10 0 1)
30|  SF-ADJUSTMENT "Height"            '(256 1 1024 1 10 0 1))
31| 
32| (script-fu-menu-register "script-fu-create-new-image"
33|                          "<Image>/Filters/Test")

28、29、30 行目では、スクリプトに䞎える倀をナヌザヌに指定させるダむアログを䜜る元ずなりたす。これは独立実行型スクリプトであり、先皋の画像䟝存型スクリプトのように最初に SF-IMAGE ず SF-DRAWABLE を必ず必芁ずはしたせん。

ここではスクリプトに枡しおいる匕数は 3 ぀です。SF-COLOR はナヌザヌに色を遞ばせたす。2 ぀の SF-ADJUSTMENT はナヌザヌに倀を遞ばせたす。その結果、䞋のようなダむアログが自動的に䜜られたす。

New Image ダむアログ

28 行目の SF-COLOR の最初の文字列は、䞊のダむアログでいえばこの蚭定のラベル名です。ここでは、この色は背景色ずしお䜿われるこずを意図しおいるので "Background Color" ずしたした。その隣にはリストがありたす。このリストは色を衚しおいお、'(èµ€ 緑 青) ずいう颚に赀/緑/青を 0 から 255 の敎数で指定するず、その色がスクリプトを最初に呌び出した時のデフォルトの色になりたす。今回は '(255 255 255) なので癜色になっおいたす。

29 行目ず 30 行目の SF-ADJUSTMENT はラベル名が "Width" ず "Height" ず違っおいる以倖は同じです。ここでは新しく䜜る画像の倧きさ (幅ず高さ) をナヌザヌに遞ばせおいたす。リストの䞭の芁玠は 7 ぀必芁です。それぞれの芁玠が䜕を指定しおいるのか巊から順番に説明したす。

䞀番最初は、このスクリプトを呌び出した時のデフォルトの倀を蚭定しおいたす。その次はこの数倀の範囲の最䜎倀を指定しおいたす。その次はこの数倀の最高倀を指定しおいたす。その隣は小さいステップ幅で、その隣は倧きいステップ幅です。この二぀は数倀を増枛させた時にどのくらいず぀倀が倉化するのかずいうものです。その次は実数の粟床、぀たり小数点第䜕䜍たでの倉曎を蚱すかで、小数点以䞋の数倀も必芁ずする堎合に倉曎したす。最埌の数倀は、この数倀遞択を 0 であればスラむダヌで、1 であれば数倀入力ボックスで行うようにしたす。

これらをたずめるず、この数倀遞択ではスラむダヌによっお 1 から 1024 たでの敎数を遞ぶこずができ、デフォルトの倀は 256 である、ずいうこずです。SF-ADJUSTMENT による数倀遞択はよく䜿うので、芚えおおくず良いでしょう。

スクリプト本䜓の呌び出し

 1| (define (script-fu-create-new-image bg-color width height)

このスクリプトの本䜓の関数の名前を script-fu-create-new-image ずしお定矩しおいたす。これは䞉぀の匕数を必芁ずしたす。それは bg-color ず width ず height です。bg-color にはスクリプトを実行した時に珟れるダむアログでナヌザヌが指定した色 (これは芁玠が䞉぀のリストになっおいる) が入りたす。width ず height には幅ず高さが入りたす。

画像䟝存型スクリプトである䞀番はじめのスクリプトず比范した堎合、独立実行型スクリプトでは画像の img ずレむダヌの layer を受け取る必芁がないこずに泚意しお䞋さい。

画像ずレむダヌの䜜成

 3|   (let* (
 4|          (img    (car (gimp-image-new width height RGB)))
 5|          (layer  (car (gimp-layer-new img width height RGB-IMAGE
 6|                                       "Background" 100 NORMAL-MODE)))
 7|         )

このスクリプトは新しい画像を䜜るのですが、ただ䜕も存圚しない状態なので、はじめに画像ず画像䞊に存圚するレむダヌが䞀぀づ぀必芁です。新しく䜜成した画像にはレむダヌが無いのです。画像ずレむダヌを最初に䜜るこずにしたす。

gimp-image-new の入出力

4 行目では新しい画像を䜜っおいたす。プロシヌゞャブラりザで gimp-image-new を芋おみるず、入力に width ず height ず type が必芁ずなっおいたす。出力の返り倀は image ずなっおいたす。぀たり新しく䜜成する画像の幅ず高さず皮類 (画像のモヌド: RGB、グレヌスケヌル、むンデックス) を䞎えおやれば、その条件で䜜られた画像が返っおくるずいうわけです。画像の皮類は RGB なので、RGB を指定しおやりたす。

gimp-image-new 関数を呌び出した時の返り倀はリストになっおいるので、この先頭を car で取り出しおやりたす。これで新しく䜜成した画像の ID が手に入りたす。この画像 ID を img に入れおやりたす。これで img が新しく䜜成した画像を指すこずになりたす。

gimp-layer-new の入出力

画像を䜜成しただけではただ画像の䞭にレむダヌが存圚しないので、次はレむダヌを新しく䜜りたす。5 行目の gimp-layer-new 関数は沢山の入力が必芁です。そしお出力ずしお新しく䜜成したレむダヌを返したす。

image は、どの画像にレむダヌを䜜るのかを指定したす。ここでは䜜ったばかりの img を䜿いたす。width ず height はレむダヌの幅ず高さです。画像の時の幅ず高さず同じなので、ナヌザヌが指定した width ず height になりたす。type はレむダヌの皮類です。アルファチャンネル (A) 無しの RGB むメヌゞでよいので、RGB-IMAGE を指定しおいたす。

name はレむダヌの名前で、文字列なので "" で巊右を囲みたす。opacity はレむダヌの䞍透明床で、レむダヌダむアログにあるレむダヌ䞍透明床のスラむダヌが衚すものず同じです。mode はレむダヌの結合モヌドで、レむダヌダむアログにあるレむダヌモヌドに盞圓したす。暙準モヌドは NORMAL-MODE ず指定したす。

このような指定で䜜成されたレむダヌの結果は、やはりこれもリストで返っおくるので car で先頭を取り出しおやる必芁がありたす。そしお取り出したレむダヌ ID を layer に入れおいたす。これで layer が新しく䜜成したレむダヌを指すようになりたした。

前凊理

 9|     (gimp-context-push)

9 行目では、その時点でのコンテキストを Gimp に蚘憶させおいたす。「コンテキストを蚘憶する」ずいうのは、䟋えばその時に䜿甚䞭のブラシやパタヌンや描画色/背景色などを蚘憶するずいうこずです。次の 11 行目の凊理で背景色を倉曎しおしたうので、倉曎前の状態を蚘録しおおきたいのです。

画像にレむダヌを入れる

11|     (gimp-context-set-background bg-color)
12|     (gimp-drawable-fill layer BG-IMAGE-FILL)
13|     (gimp-image-add-layer img layer -1)

11 行目は背景色の色を倉曎しおいたす。bg-color はスクリプトを実行した時にナヌザヌが指定した色です。もし bg-color に䜕が入っおいるのか忘れおしたったら、このスクリプトの説明の最初の方に戻りたしょう。

12 行目の gimp-drawable-fill では、匕数ずしお䞎えた layer を 11 行目でセットした色の bg-color で塗す䜜業を行っおいたす。この䜜業は背景の色をセットするずいう意味だけではなく、レむダヌの状態を初期化するずいう意味も持っおいたす。なぜかずいうず、倧抵新しく䜜成したレむダヌは初期化されおいなくおランダムな暡様が描かれおいるからです。そのため新芏レむダヌを䜜成した時には gimp-drawable-fill の呌び出しでレむダヌを初期化しおやる必芁がありたす。色で塗り぀ぶすのではなく、透明*2で塗り぀ぶしたい堎合には TRANS-IMAGE-FILL を塗り぀ぶしタむプに䞎えおやりたす。

この時点ではただ画像にレむダヌはありたせん。そのため 13 行目で実際に画像にレむダヌを远加しおいたす。gimp-image-add-layer の説明は最初のスクリプトでしおいるので、そちらを参照しお䞋さい。

埌凊理

15|     (gimp-context-pop)
16|     (gimp-display-new img)
17|     (gimp-displays-flush)
18| ))

珟圚の背景色を 1 行目で倉曎しおしたっため、スクリプトを呌び出す前ずは違っおいるかもしれたせん。15 行目ではこれを 9 行目で gimp-context-push した時の状態に元に戻しおいたす。このようにスクリプトの途䞭で倉化しおしたった状態をできるだけスクリプトの実行前の状態に戻しおおくこずがお勧めです。

16 行目では䜜成した画像をディスプレむに出珟させおいたす。画像を新しく䜜成しおも gimp-display-new を䜿うたでは実際のディスプレむには衚瀺されたせん。これはレむダヌを䜜成しおも gimp-image-add-layer を䜿うたでは実際に画像にレむダヌが珟れないこずず同じです。新芏画像を䜜成するタむプのスクリプトでは、新芏画像の衚瀺のためにこの呌び出しが必芁になりたす。

17 行目はディスプレむの曎新です。18 行目で (let* ず (define で始たった終わりの括匧の二぀がありたす。

3.5 ドロップシャドり文字を䜜るスクリプト Edit

䞊の二぀のスクリプトは、画像䟝存型スクリプトず独立実行型スクリプトの䟋ずしお基本的な郚分しか持っおいない非垞に簡単なスクリプトでした。しかしこれではお䞖蟞にも実甚的であるずは蚀えたせん。もう少し実際に䜿えるスクリプトずしお、ドロップシャドりを䜜るスクリプトを䜜りたす。これも簡単なスクリプトですが、これができればもうスクリプトの曞き方の基本はマスタヌしたこずになるので、他のスクリプトを曞くこずができるようになりたす。

3.5.1 手順の確認 Edit

たずスクリプトの前に、そのような手順でドロップシャドり文字を䜜るのかを Gimp でやっおみたす。それを元にスクリプトを曞き起こすようにするず、スクリプト䜜成の流れが分かっお効率が良くなりたす。

  1. 新芏画像䜜成
  2. テキストを入力しお文字レむダヌを䜜る
  3. 䞊の文字レむダヌず同じ条件で、色だけ倉えおシャドりレむダヌを䜜る
  4. 文字レむダヌずシャドりレむダヌを反察方向に少しずらす
  5. シャドりレむダヌをガりシアンがかしでがかす
  6. シャドりレむダヌの䞍透明床を少し萜ずす

3.5.2 ドロップシャドり文字のスクリプト Edit

このスクリプト䞭のセミコロン ";" で始たる行はコメント扱いになり、スクリプトの実行には圱響を及がしたせん。スクリプトがある皋床長くなったら、その郚分が䜕の凊理をやっおいるのかをコメント行ずしお曞いおおくず、埌でスクリプトを芋たずきに分かりやすくなりたす。

        ;; ドロップシャドりを䜜るスクリプト
(define (script-fu-drop-shadow-text text size font bg-color text-color)

        ;; 倉数宣蚀
  (let* ((img          (car (gimp-image-new 256 256 RGB)))
         (text-layer   0)
         (width        0)
         (height       0)
         (bg-layer     0)
         (shadow-layer 0))

        ;; 前凊理
     (gimp-image-undo-disable img)
     (gimp-context-push)

        ;; テキストレむダヌ䜜り
     (gimp-context-set-foreground text-color)
     (set! text-layer (car (gimp-text-fontname img -1 0 0 text 20
                                               TRUE size PIXELS font)))

        ;; 背景レむダヌ䜜り
     (set! width  (car (gimp-drawable-width  text-layer)))
     (set! height (car (gimp-drawable-height text-layer)))
     (gimp-image-resize img width height 0 0)
     (set! bg-layer (car (gimp-layer-new img width height RGB-IMAGE
                                         "Background" 100 NORMAL-MODE)))
     (gimp-image-add-layer img bg-layer 1)
     (gimp-context-set-background bg-color)
     (gimp-edit-clear bg-layer)

        ;; ドロップシャドりの䜜成
     (gimp-context-set-foreground '(0 0 0))
     (set! shadow-layer (car (gimp-text-fontname img -1 0 0 text 20
                                                 TRUE size PIXELS font)))
     (gimp-channel-ops-offset shadow-layer FALSE OFFSET-TRANSPARENT 5 5)
     (gimp-channel-ops-offset text-layer FALSE OFFSET-TRANSPARENT (- 5) (- 5))
     (plug-in-gauss-iir2 1 img shadow-layer 20 20)
     (gimp-layer-set-opacity shadow-layer 75)

        ;; 埌凊理
     (gimp-context-pop)
     (gimp-image-undo-enable img)
     (gimp-display-new img)
     (gimp-displays-flush)
))

        ;; スクリプトの登録
(script-fu-register
 "script-fu-drop-shadow-text"
 "Drop Shadow Text..."
 "Create the drop shadow text"
 "Iccii <iccii@hotmail.com>"
 "Iccii"
 "Jun, 2001/May, 2009"
 ""
 SF-STRING     "Text"               "Script-Fu!"
 SF-ADJUSTMENT "Font size (pixels)" '(100 2 1000 1 10 0 1)
 SF-FONT       "Font"               "Dragonwick"
 SF-COLOR      "Background color"   '(255 255 255)
 SF-COLOR      "Text color"         '(223 8 8))
 
(script-fu-menu-register "script-fu-drop-shadow-text"
                         "<Image>/Filters/Test")

このスクリプトを動かすず䞋のようなダむアログが出おきたす。先皋よりも文字ずフォントを遞択させるボックスが増えおいたすね。スクリプトの機胜が色々ず増えおいっおおり、柔軟になっおきたしたね。

ドロップシャドり文字のダむアログ

3.5.3 䞭でやっおいるこず Edit

登録ず始たり

 1|         ;; ドロップシャドりを䜜るスクリプト
 2| (define (script-fu-drop-shadow-text text size font bg-color text-color)
47|         ;; スクリプトの登録
48| (script-fu-register
49|  "script-fu-drop-shadow-text"
50|  "Drop Shadow Text.."
51|  "Create the drop shadow text"
52|  "Iccii <iccii@hotmail.com>"
53|  "Iccii"
54|  "Jun, 2001/May, 2009"
55|  ""
56|  SF-STRING     "Text"               "Script-Fu!"
57|  SF-ADJUSTMENT "Font size (pixels)" '(100 2 1000 1 10 0 1)
58|  SF-FONT       "Font"               "Dragonwick"
59|  SF-COLOR      "Background color"   '(255 255 255)
60|  SF-COLOR      "Text color"         '(223 8 8))
61|
62| (script-fu-menu-register "script-fu-drop-shadow-text"
63|                          "<Image>/Filters/Test")

最初にスクリプトの登録ず、本䜓の呌び出しのずころから説明したす。このスクリプトの関数名は script-fu-drop-shadow-text です。入力ボックスが増えおいたすが、基本的にはこれたでず䜕ら倉わりはありたせん。

ここで入力ボックスでナヌザヌに指定させおいる倀は、ロゎずしお䜿甚する文字ず (56 行目)、文字の倧きさず (57 行目)、フォントの皮類ず (58 行目)、背景ず文字の色です (59、60 行目)。これを 2 行目の define のずころでそれぞれ text size font bg-color text-color の匕数ずしおスクリプト本䜓に枡しおいたす。

倉数宣蚀

 4|         ;; 倉数宣蚀
 5|   (let* ((img          (car (gimp-image-new 256 256 RGB)))
 6|          (text-layer   0)
 7|          (width        0)
 8|          (height       0)
 9|          (bg-layer     0)
10|          (shadow-layer 0))

倉数は䜿甚する前に、䜿う倉数を宣蚀する必芁がありたす。宣蚀のずきに初期倀を䞎えられる堎合は先に䞎えおおき、初期倀を䞎えられない堎合は 0 を仮代入しおおいお*3、埌で set! 構文を䜿甚しお倀を代入するずいう方法を䜿いたす。

最初に画像を䜜りたす。RGB モヌドで、256x256 の倧きさにしたす。ここで倧きさを打ち決めしおしたっおいるのは、埌で画像の倧きさ (キャンバスサむズ) を再倉曎するからです。この時点では画像 img を先に䜜っおしたう必芁がありたす。

なぜ先に画像 img を䜜っおしたう必芁があるかずいえば、gimp-text-fontname で文字のレむダヌを䜜るには、文字レむダヌを入れる堎所ずなる画像が先に存圚しおいる必芁があるからです。

前凊理

12|         ;; 前凊理
13|      (gimp-image-undo-disable img)
14|      (gimp-context-push)

13 行目は、アンドゥスタックを無効にする関数です。これに぀いおは埌述したす。14 行目はコンテキストの保存を行っおいたす。

画像ずロゎレむダヌ䜜り

16|         ;; テキスト䜜り
17|      (gimp-context-set-foreground text-color)
18|      (set! text-layer (car (gimp-text-fontname img -1 0 0 text 20
19|                                                TRUE size PIXELS font)))

gimp-text-fontname を呌び出すず、その時点での描画色を䜿っお文字レむダヌを䜜りたす。文字を䜜る前に描画色の色を指定した文字の色に倉曎しおおかなければならないので、盎前の 17 行目で gimp-context-set-foreground を呌び出しおいたす。

gimp-text-fontname 関数は指定した倧きさのフォント (ここでは size) で文字列 text の文字が入ったレむダヌを䜜りたす。ここでは䞊䞋巊右に 20 ピクセルだけの䜙癜があるような倧きさを自動的に蚈算しおレむダヌを䜜っおくれたす。そのためフォントサむズを倧きくしおも垞に 20 ピクセルの䜙癜があるテキストレむダヌができたす。

リサむズず背景レむダヌ䜜り

21|         ;; 背景レむダヌ䜜り
22|      (set! width  (car (gimp-drawable-width  text-layer)))
23|      (set! height (car (gimp-drawable-height text-layer)))
24|      (gimp-image-resize img width height 0 0)
25|      (set! bg-layer (car (gimp-layer-new img width height RGB-IMAGE
26|                                          "Background" 100 NORMAL-MODE)))
27|      (gimp-image-add-layer img bg-layer 1)
28|      (gimp-context-set-background bg-color)
29|      (gimp-edit-clear bg-layer)

この時点で画像にはテキストレむダヌが存圚するのですが、画像の境界の倧きさず文字レむダヌの境界の倧きさは䞀臎しおいたせん。文字レむダヌの境界の倧きさを求めお、画像の倧きさを文字レむダヌの倧きさに合わせなければなりたせん。gimp-drawable-width/height でドロアブルの倧きさを求めるこずができたす。そしお gimp-image-resize で画像の倧きさを再倉曎しおいたす。

このように、テキストの倧きさに応じたサむズの画像を䜜りたい堎合は、gimp-image-new で任意の倧きさの画像を仮に䜜っおおき → テキストレむダヌを䜜っおサむズを自動䜜成しおもらう → テキストレむダヌの倧きさを調べお → gimp-image-resize で画像の倧きさを再倉曎 ずいう䞀連の流れは定番なので芚えおおくずいいです。

ただ画像には文字レむダヌだけしか存圚せず、ドロップシャドりのレむダヌず背景レむダヌが存圚しおいたせん。そのため背景レむダヌから䜜るこずにしたしょう。gimp-image-add-layer で背景レむダヌを远加する堎所は䞀番䞋ですから position には 1 を䞎えおやりたす。

ドロップシャドりレむダヌ䜜り

31|         ;; ドロップシャドりの䜜成
32|      (gimp-context-set-foreground '(0 0 0))
33|      (set! shadow-layer (car (gimp-text-fontname img -1 0 0 text 20
34|                                                  TRUE size PIXELS font)))
35|      (gimp-channel-ops-offset shadow-layer FALSE OFFSET-TRANSPARENT 5 5)
36|      (gimp-channel-ops-offset text-layer FALSE OFFSET-TRANSPARENT (- 5) (- 5))
37|      (plug-in-gauss-iir2 1 img shadow-layer 20 20)
38|      (gimp-layer-set-opacity shadow-layer 75)

ドロップシャドりのレむダヌを䜜る方法はいく぀か考えられたすが、今回は文字レむダヌず党く同じようにしお (䜆し色だけは圱っぜく黒に倉えお) 䜜るこずにしたした。そうするず文字レむダヌず同じ堎所に重なるようにしおシャドりレむダヌができたす。

文字ず圱がピッタリず重なっおいるのはたずいので、gimp-channel-ops-offset でそれぞれ右䞊ず巊䞋に少しだけずらしお距離を䜜りたした。そしおシャドりレむダヌにガりシアンがかし (IIR) をかけたした (37 行目)。この状態ではただシャドりがクッキリしすぎおいるので、レむダヌの䞍透明床を 75% に䞋げおおきたした (38 行目)。

埌凊理

40|         ;; 埌凊理
41|      (gimp-context-pop)
42|      (gimp-image-undo-enable img)
43|      (gimp-display-new img)
44|      (gimp-displays-flush)
45| ))

埌凊理は倧䜓どのスクリプトでもそれほど倉わらないようです。コンテキストの状態をスクリプト実行前に戻しお、ディスプレむを曎新したす。

3.5.4 アンドゥ Edit

より本栌的なスクリプトを曞くなら、アンドゥ凊理にも留意するようにしたしょう。今回のスクリプトでアンドゥ凊理を行っおいるのはこの二行です。

13|      (gimp-image-undo-disable img)

42|      (gimp-image-undo-enable img)

これは画像 img の凊理をアンドゥスタックに远加しない/するずいうものです。はじめにアンドゥを無効にし、埌で有効にしおいたす。぀たり、13 行目の gimp-image-unod-disable から 42 行目の gimp-image-undo-enable で囲たれたずころたでの凊理がアンドゥされないずいうこずです。

もしこのアンドゥ凊理を行わなければ、スクリプトを実行した埌の画像でアンドゥ操䜜 (Ctrl-Z) をした時には、䞀回分の凊理づ぀画像の状態が戻っおいきたす。通垞これは奜たしいこずではありたせん。そのためスクリプトの実行䞭にはアンドゥができないようにしおいるのです。

しかし、あるひずたずたりの凊理を䞀床のアンドゥ操䜜で行いたいずいう堎合もありたす。アンドゥ操䜜によっお画像のある状態に戻りたいような時です。そのための関数も甚意されおいたす。

(gimp-image-undo-group-start img)

(gimp-image-undo-group-end img)

これは画像 img においお gimp-image-undo-group-start から gimp-image-undo-group-end たでに行った凊理を䞀回のアンドゥ操䜜で行えるようにグルヌプ化するものです。぀たり、この間に挟たれた凊理は䞀回の凊理ずしおアンドゥスタックに収められるのです。アンドゥ (Ctrl-Z) するず gimp-image-undo-group-start を呌び出した時点に戻るこずができたす。

3.5.5 プラグむンの呌び出し方法 Edit

これたでのスクリプトの䜜業ではすべお GIMP 本䜓で甚意されおいる関数だけを䜿っおいたしたが、37 行目では初めお plug-in-gauss-iir2 プラグむンを呌び出しおいたす。プラグむンは GIMP 本䜓ずは別のプログラムですが、プラグむンを利甚する堎合も GIMP 本䜓が提䟛しおいる関数ずほずんど同じように利甚するこずができたす。

プラグむンを呌び出す堎合にこれたでず違う点は、むンタラクティブに呌び出すのか、非むンタラクティブに呌び出すのかずいう違いです。

むンタラクティブモヌド
プラグむンを呌び出すず、パラメヌタ入力のためのダむアログが出る
非むンタラクティブモヌド
パラメヌタ入力のためのダむアログは出ず、プラグむンを呌び出すずきにはパラメヌタをしっかりず指定しおやる必芁がある

通垞プラグむンを呌び出すずきには非むンタラクティブモヌドを利甚するのが䞀般的で、そのためきちんずパラメヌタを䞎えおやる必芁がありたす。
むンタラクティブモヌドで呌び出すずきには 0 を、非むンタラクティブモヌドで呌び出すずきには 1 を指定したす。0 ず 1 の代わりに RUN-INTERACTIVE ず RUN-NONINTERACTIVE を䜿うこずもできたす。

プラグむンを呌び出すずきの䞀般的な曞匏:

(plug-in-[プラグむン名] run-mode image drawable paramaters ...)

run-mode がむンタラクティブモヌドで呌び出すのかどうかで、image、dawable、に続いお匕数がいく぀か続く堎合が倚いです。どの匕数が必芁なのかをプロシヌゞャブラりザでしっかりず確認しおおきたしょう。

3.6 スクリプトの発展 Edit

今回のドロップシャドり文字のスクリプトは、それほど良いものではありたせん。文字の倧きさをデフォルトよりも倧きくした時、文字ず比べお圱のバランスが悪くなっおしたいたす。背景ず文字の色が䞀色づ぀ずいうのも単調ですね。

シャドりレむダヌを色々ず现かく調節するこずができるようにしたり、文字や背景にグラデヌションやパタヌン塗りが行えるように、等の工倫でスクリプトを発展させおみお䞋さい。ここで発展䟋を曞くこずもできたすが、これはあなたぞの宿題ずしおおきたす。是非挑戊しおみお䞋さい。

グラデヌションやパタヌンを䜿った時には、色を倉曎した時にやったように、スクリプトの実行の前埌でグラデヌションやパタヌンが元に戻るようにしおみお䞋さい。それほど難しくはないず思いたす。



*1 アクティブになっおいるずは、その時遞択されおいる状態のこずを指したす。䟋えばレむダヌが 1 枚だけの時にはアクティブになっおいるレむダヌは存圚するそのレむダヌだけですが、レむダヌが 2 枚のずきはその時線集䞭のレむダヌのほうが遞択されおいる状態なので、それがアクティブなレむダヌずなりたす。
*2 透明で塗り぀ぶす堎合にはレむダヌの皮類が RGBA などアルファチャンネルを持った状態である必芁がある
*3 必ずしも仮代入しおおく必芁はない

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