トップ > Script-Fuスクリプトの制作 >
Script-Fuプログラミングの基礎を学ぶ

  

Script-Fuプログラミングの基礎

前の記事までは、プログラミング言語Schemeに関する知識を主に解説してきました。 ここからは、Script-Fuプログラミングに関する内容について解説していきます。 GIMP専用の手続き(関数)についての解説が主になります。

ここまではGIMP専用の手続きといえば、

  1. gimp-quit
  2. gimp-message
  3. script-fu-register
  4. script-fu-menu-register

ぐらいしか紹介していません。 ここからは、その他のGIMP専用の手続きについて紹介していきます

最初に知るべき大切なこと

GIMP専用の手続きを利用する上で、絶対に知っておかなければならない大切なことがあります。 GIMP専用の手続きには結果を返すものと返さないものがありますが、結果を返すGIMP専用の手続きは必ずリストで結果を返す、ということです。

返される結果のデータが1件の場合も複数件の場合も必ずリストで返されます。

つまり、GIMP専用の手続きから返されたデータを参照するには、手続き car・cadrなどを利用する必要がある、ということです。

  
手続きから返される結果の値のことを 戻り値(もどりち) もどりち 戻り値(もどりち) といいます。 以降は "戻り値" と表記します。

画像の幅と高さを取得する

ではここで、新たな手続き gimp-image-width と gimp-image-height について紹介します。

手続き 機能
gimp-image-width 画像の幅を返す
※キャンバスの幅のこと
gimp-image-height 画像の高さを返す
※キャンバスの高さのこと

これらの手続きを利用し、開いている画像の幅と高さを取得して表示するスクリプトを作成してみましょう。 スクリプトファイル myscript.scm を以下のように書き換えます。

  1. (define (myscript image)
  2. (let
  3. (
  4. (image-width 0)
  5. (image-height 0)
  6. )

  7. (set! image-width (car (gimp-image-width image)))
  8. (set! image-height (car (gimp-image-height image)))

  9. (gimp-message (string-append "Width is " (number->string image-width) " / Height is " (number->string image-height)))
  10. )
  11. )

  12. (script-fu-register
  13. "myscript" ; 登録する関数の名前
  14. "My Script" ; メニュー項目のラベル
  15. "自作の練習用スクリプトです" ; メニュー項目の説明
  16. "My Name" ; 作成者の名前
  17. "My Name" ; 著作権者の名前
  18. "January 1, 2023" ; 作成日(改訂日)
  19. "RGB* GRAY*" ; メニュー項目を有効にするための条件
  20. SF-IMAGE "Image" 0 ; 画像番号
  21. )

  22. (script-fu-menu-register
  23. "myscript" ; 対象の関数の名前
  24. "<Image>/Filters" ; メニュー項目の位置
  25. )
 

では、このスクリプトを試してみましょう。

1. 任意の大きさの画像を開く
1. 任意の大きさの画像を開く

上図のように任意の大きさの画像を開きます。 今回は320 x 200の新規画像を作成しました。

では、スクリプトを実行しましょう。 プルダウンメニューの"フィルター(R) -> My Script"を実行します。

2. ウィンドウ下部に "Width is 320 / Height is 200" と表示される
2. ウィンドウ下部に "Width is 320 / Height is 200" と表示される

上図のようにウィンドウ下部に "Width is 320 / Height is 200" と表示されます。 目指していた通りに、画像の幅と高さを表示させることができました。


では、スクリプトの内容を詳しく見てみましょう。 最初に注目すべきは23行目の、

SF-IMAGE    "Image" 0               ; 画像番号

という部分です。 手続き script-fu-registerの引数が、これまでの7行から8行に増えています。 この部分は、開いてる画像の画像番号を受け取るための記述です。 画像にアクセスするスクリプトを作成するなら、この行は必ず書かなければなりません

なお、増えている8行目の引数は、引数の数でいうと 3つ です。 つまり、引数の数が 7個 から 10個 に増えているのです。 増えた引数は、

  1. SF-IMAGE
  2. "Image"
  3. 0(ゼロ)

の3つです。 人間が見やすくなるように1行で記述していますが、増えた引数の数は3つです。

なお、SF-IMAGEというのが画像番号を意味しており、"Image" と 0(ゼロ) は今回の例では無意味です。

手続き script-fu-registerの引数は3ずつ増える

手続き script-fu-registerに渡す引数の数は、最低で7つです。 今回の例では8つ目以降の引数を渡していますが、これは、

  1. 独自の関数myscriptが画像番号を受け取れるようにするため

です。 画像にアクセスするなら画像番号を受け取る必要があり、そのためにはscript-fu-registerの引数を増やす必要があるのです。

そしてここが重要なのですが、script-fu-registerの引数を増やす場合は必ず3ずつ増やして記述します。 今回増えた引数の、

  1. SF-IMAGE
  2. "Image"
  3. 0(ゼロ)

の3つの中で、"Image" と 0(ゼロ) は無意味なのに記述しているのはそのためです。 引数の数を10個にするため、あえて無駄なものを記述しているのです。

なお、なぜ3ずつ増やすのかは、後ほど説明します

作成するスクリプトが
受け取る引数の数
script-fu-registerへ
渡す引数の数
無し 7
1 10
2 13
3 16

長くなってきましたので、以下にスクリプトを再掲載します。 内容は最初に掲載したものと同じです。

  1. (define (myscript image)
  2. (let
  3. (
  4. (image-width 0)
  5. (image-height 0)
  6. )

  7. (set! image-width (car (gimp-image-width image)))
  8. (set! image-height (car (gimp-image-height image)))

  9. (gimp-message (string-append "Width is " (number->string image-width) " / Height is " (number->string image-height)))
  10. )
  11. )

  12. (script-fu-register
  13. "myscript" ; 登録する関数の名前
  14. "My Script" ; メニュー項目のラベル
  15. "自作の練習用スクリプトです" ; メニュー項目の説明
  16. "My Name" ; 作成者の名前
  17. "My Name" ; 著作権者の名前
  18. "January 1, 2023" ; 作成日(改訂日)
  19. "RGB* GRAY*" ; メニュー項目を有効にするための条件
  20. SF-IMAGE "Image" 0 ; 画像番号
  21. )

  22. (script-fu-menu-register
  23. "myscript" ; 対象の関数の名前
  24. "<Image>/Filters" ; メニュー項目の位置
  25. )

続いて注目すべきは、1行目の、

(define (myscript image)

という部分です。 関数の名前である myscript の後ろに image という記述があります。 この記述は『imageという名前で引数を受け取る』ことを意味しています。

この引数 imageは、23行目で増やした手続き script-fu-registerへの引数である、

SF-IMAGE    "Image" 0               ; 画像番号

に対応しています。 つまり、画像番号を image という名前の引数で受け取っているのです。

次の注目点は22行目の、

"RGB* GRAY*"                        ; メニュー項目を有効にするための条件

という記述です。 以前の記事でも説明したように、ここにはメニュー項目を有効にするための条件を記述します

今回は "RGB*" と "GRAY*" と記述しましたが、この記述だとカラーモードがRGB形式かグレースケール形式の場合にメニュー項目が有効になります。 つまり、画像を開いていない状態では実行できないようにしているのです。

  
カラーモードの詳細については、知っておきたい機能 > 全般 > カラーモード(色の形式)を参照ください。

続いては、4・5行目に注目してみましょう。 4・5行目では、

(image-width  0)
(image-height 0)

と、2つの変数を宣言しています。 この2つの変数には後ほど取得する画像の幅と高さを格納します。

最後の注目点が肝心の8・9行目の、

(set! image-width  (car (gimp-image-width image)))
(set! image-height (car (gimp-image-height image)))

の2行です。 この2行が画像の幅と高さを取得している部分です。

手続き gimp-image-width と gimp-image-height には、引数として画像番号を渡す必要があります。 受け取った引数 imageが画像番号ですので、引数 imageをそのまま渡しています。

手続き gimp-image-width と gimp-image-height から返された結果は、手続き carを使って取り出し、変数 image-width と image-height に格納しています。

すでに説明したように、GIMP関連の手続きは戻り値が1件の場合も複数件の場合も必ずリストで返します。 よって、手続き carが必要というわけです。

画像の大きさが320 x 200の場合だと仮定すると、手続き gimp-image-width から返された戻り値を入れ子のコンスセルで表現すると、

320
<空っぽ>

となり、手続き gimp-image-height から返された戻り値は、

200
<空っぽ>

となります。 手続き carを利用しなければ、320 や 200 を取り出すことはできません。


ではここで、手続き gimp-image-widthの仕様を確認しておきましょう。 引数をいくつ受け取るのか、引数には何を渡すのか、戻り値はいくつで何が返されるのかなどを確認します。

Script-Fu プロシージャブラウザーから確認します。 Script-Fu プロシージャブラウザーの開き方については以前のこの記事で解説しています。

3. 手続き gimp-image-widthの詳細が表示される
3. 手続き gimp-image-widthの詳細が表示される

上図のようにScript-Fu プロシージャブラウザーを開き、gimp-image-widthを検索します。 この詳細からわかる内容は以下の通りです。

手続きの名前 gimp-image-width
手続きの機能

画像の幅を返す。

引数の数 1つ
1つ目の引数の名前
1つ目の引数の種別
1つ目の引数の意味
image
IMAGE
画像番号
戻り値の数 1つ
1つ目の戻り値の名前
1つ目の戻り値の種別
1つ目の戻り値の意味
width
INT32
画像の幅

1つ目の引数の種別が IMAGE となっていますが、これが画像番号のことです。 また、1つ目の戻り値の種別が INT32 となっていますが、これは数値(Integer:整数)のことです

引数や戻り値の種別(データ型) 意味
IMAGE 画像番号
INT32 数値(整数)

レイヤの枚数およびレイヤ番号の一覧とレイヤの名称を取得する

では次に、新たな手続き gimp-image-get-layers と gimp-layer-get-name について紹介します。

手続き 機能
gimp-image-get-layers レイヤの枚数・レイヤ番号の一覧を返す
gimp-layer-get-name レイヤ番号に対するレイヤ名称を返す

これらの手続きを利用し、開いている画像のレイヤの名称を列挙するスクリプトを作成してみましょう。 スクリプトファイル myscript.scm を以下のように書き換えます。

  1. (define (myscript image)
  2. (let
  3. (
  4. (layer-array 0)
  5. (layer-count 0)
  6. (layer-index 0)
  7. (layer-id 0)
  8. (layer-name "")
  9. (message "")
  10. )

  11. (set! layer-array (cadr(gimp-image-get-layers image)))
  12. (set! layer-count (car(gimp-image-get-layers image)))

  13. (set! message (string-append "Layer Name is "))

  14. (while (< layer-index layer-count)
  15. (set! layer-id (vector-ref layer-array layer-index))

  16. (set! layer-name (car (gimp-layer-get-name layer-id)))

  17. (if (> layer-index 0)
  18. (begin
  19. (set! message (string-append message " / "))
  20. )
  21. )

  22. (set! message (string-append message layer-name))

  23. (set! layer-index (+ layer-index 1))
  24. )

  25. (gimp-message message)
  26. )
  27. )

  28. (script-fu-register
  29. "myscript" ; 登録する関数の名前
  30. "My Script" ; メニュー項目のラベル
  31. "自作の練習用スクリプトです" ; メニュー項目の説明
  32. "My Name" ; 作成者の名前
  33. "My Name" ; 著作権者の名前
  34. "January 1, 2023" ; 作成日(改訂日)
  35. "RGB* GRAY*" ; メニュー項目を有効にするための条件
  36. SF-IMAGE "Image" 0 ; 画像番号
  37. )

  38. (script-fu-menu-register
  39. "myscript" ; 対象の関数の名前
  40. "<Image>/Filters" ; メニュー項目の位置
  41. )
 

では、このスクリプトを試してみましょう。

1. 複数のレイヤを持つ画像を開く
1. 複数のレイヤを持つ画像を開く

上図のように複数のレイヤを持つ画像を開きます。 今回は上から "太陽" / "雲" / "青空" の3枚のレイヤを持つ画像です。

では、スクリプトを実行しましょう。 プルダウンメニューの"フィルター(R) -> My Script"を実行します。

2. ウィンドウ下部に "Layer Name is 太陽 / 雲 / 青空" と表示される
2. ウィンドウ下部に "Layer Name is 太陽 / 雲 / 青空" と表示される

上図のようにウィンドウ下部に "Layer Name is 太陽 / 雲 / 青空" と表示されます。 目指していた通りに、レイヤの名称を列挙することができました。


スクリプトの中身を解説する前に、手続き gimp-image-get-layersの仕様を確認しておきましょう。 Script-Fu プロシージャブラウザーから確認します。

3. 手続き gimp-image-get-layersの詳細が表示される
3. 手続き gimp-image-get-layersの詳細が表示される

上図のようにScript-Fu プロシージャブラウザーを開き、gimp-image-get-layersを検索します。 この詳細からわかる内容は以下の通りです。

手続きの名前 gimp-image-get-layers
手続きの機能

レイヤ番号の一覧を返す。

引数の数 1つ
1つ目の引数の名前
1つ目の引数の種別
1つ目の引数の意味
image
IMAGE
画像番号
戻り値の数 2つ
1つ目の戻り値の名前
1つ目の戻り値の種別
1つ目の戻り値の意味
num-layers
INT32
レイヤの枚数
2つ目の戻り値の名前
2つ目の戻り値の種別
2つ目の戻り値の意味
layer-ids
INT32ARRAY
レイヤ番号の一覧

2つ目の戻り値の種別が INT32ARRAY となっていますが、これはINT32(整数)のベクタのことです。 なお、引数や戻り値の種別が xxxxARRAY となっていても、それが必ずベクタであるとは限りません。 リストの場合もあります。

引数や戻り値の種別(データ型) 意味
INT32ARRAY 数値(整数)のベクタ

説明には "The list of layers..." と書かれていますが、ここでの "list" とは "一覧" という意味のリストであり、プログラミング言語Schemeのリスト(コンスセルがつながったもの)のことではありません

なお、(しつこいようですが)、GIMP関連の手続きは戻り値をリストで返します。 この手続きが返す INT32のnum-layer も INT32ARRAYのlayer-ids もリストの要素として返されます

例えば、3枚のレイヤを持つ画像で、レイヤ番号が 1・2・8 の場合は、この手続きからの戻り値は、

3
1) 1
2) 2
3) 8
<空っぽ>

となります。

従って、手続き carを使うことで、

3

というINT32の整数を取り出すことができ、手続き cadrを使うことで、

1) 1
2) 2
3) 8

というINT32のベクタを取り出すことができます。 取り出したベクタの中のそれぞれの情報を取り出すには、過去の記事で紹介した手続き vector-refを使います


では、スクリプトの中身を見ていきましょう。 寄り道が長くなったので、以下にスクリプトを再掲載します。 内容は最初に掲載したものと同じです。

  1. (define (myscript image)
  2. (let
  3. (
  4. (layer-array 0)
  5. (layer-count 0)
  6. (layer-index 0)
  7. (layer-id 0)
  8. (layer-name "")
  9. (message "")
  10. )

  11. (set! layer-array (cadr(gimp-image-get-layers image)))
  12. (set! layer-count (car(gimp-image-get-layers image)))

  13. (set! message (string-append "Layer Name is "))

  14. (while (< layer-index layer-count)
  15. (set! layer-id (vector-ref layer-array layer-index))

  16. (set! layer-name (car (gimp-layer-get-name layer-id)))

  17. (if (> layer-index 0)
  18. (begin
  19. (set! message (string-append message " / "))
  20. )
  21. )

  22. (set! message (string-append message layer-name))

  23. (set! layer-index (+ layer-index 1))
  24. )

  25. (gimp-message message)
  26. )
  27. )

  28. (script-fu-register
  29. "myscript" ; 登録する関数の名前
  30. "My Script" ; メニュー項目のラベル
  31. "自作の練習用スクリプトです" ; メニュー項目の説明
  32. "My Name" ; 作成者の名前
  33. "My Name" ; 著作権者の名前
  34. "January 1, 2023" ; 作成日(改訂日)
  35. "RGB* GRAY*" ; メニュー項目を有効にするための条件
  36. SF-IMAGE "Image" 0 ; 画像番号
  37. )

  38. (script-fu-menu-register
  39. "myscript" ; 対象の関数の名前
  40. "<Image>/Filters" ; メニュー項目の位置
  41. )

まず、4行目から9行目で、

(layer-array 0)
(layer-count 0)
(layer-index 0)
(layer-id    0)
(layer-name  "")
(message     "")

のように変数を宣言していますが、それぞれの変数の役割は以下の通りです。

変数 役割
layer-array レイヤ番号の一覧
※ベクタ
layer-count レイヤの枚数
layer-index 何枚目のレイヤを処理しているか
※ 0 → 1 → 2 のように変化していく
layer-id 処理中のレイヤのレイヤ番号
layer-name 処理中のレイヤのレイヤ名
message 最終的に表示するメッセージ

次に注目すべきは12・13行目です。

(set! layer-array (cadr(gimp-image-get-layers image)))
(set! layer-count (car(gimp-image-get-layers image)))

手続き gimp-image-get-layersから返された2つ目の戻り値を変数 layer-arrayに、1つ目の戻り値を変数 layer-countに格納しています。

例えば、3枚のレイヤを持つ画像でレイヤ番号が 1・2・8 の場合は、変数 layer-arrayには、

1) 1
2) 2
3) 8

というベクタのデータが格納されます。 同様に変数 layer-countには、

3

が格納されます。

次に注目すべき箇所は、17行目から31行目までの手続き whileによる繰り返しの部分です。 繰り返しの条件が、

(< layer-index layer-count)

となっており、変数 layer-indexが変数 layer-countよりも小さい間は処理を繰り返します。

変数 layer-indexは初期値が 0(ゼロ) で、30行目の、

(set! layer-index (+ layer-index 1))

という記述により、毎回 +1 されますので、繰り返される回数は変数 layer-countの値(=レイヤの枚数)と同じになります。

繰り返しの内側では、

(set! layer-id (vector-ref layer-array layer-index))

という記述により、変数 layer-arrayのベクタの中の情報が1件だけ取り出されて変数 layer-idに格納されます。 変数 layer-indexを番号とする情報が取り出されるので、繰り返しの1回目では、

1

が取り出され、繰り返しの2回目には、

2

が取り出され、繰り返しの3回目には、

8

が取り出されます。

その次の行の、

(set! layer-name (car (gimp-layer-get-name layer-id)))

では、変数 layer-idに格納されているレイヤ番号からレイヤ名称を取得し、変数 layer-nameに格納しています。

同じく繰り返しの内側である22行目から26行目では、

(if (> layer-index 0)
    (begin
        (set! message (string-append message " / "))
    )
)

のように、変数 messageに格納されている文字列を操作しています。 変数 layer-indexが 0(ゼロ) より大きければ変数 messageに文字列 " / " を連結しています。

これは、繰り返しの2回目以降ならレイヤ名とレイヤ名の間を区切るための区切りとして " /" を足す、という処理です。

その次の、

(set! message (string-append message layer-name))

では、20行目で取得したレイヤ名称を変数 messageに連結しています。

繰り返しを抜けると33行目でメッセージが表示されます。

(gimp-message message)

により、変数 messsageの中身がメッセージとして表示されます。

ちょっと変更してみよう

ではここで、作成したスクリプトをちょっただけ変更してみましょう。 レイヤの枚数を手続き gimp-image-get-layers から取得するのではなく、手続き vector-lengthで求めましょう。 手続き vector-lengthはベクタの情報件数を返します。

では、手続き vector-lengthを利用してみましょう。 スクリプトファイル myscript.scm を以下のように修正します。

  1. (define (myscript image)
  2. (let
  3. (
  4. (layer-array 0)
  5. (layer-count 0)
  6. (layer-index 0)
  7. (layer-id 0)
  8. (layer-name "")
  9. (message "")
  10. )

  11. (set! layer-array (cadr(gimp-image-get-layers image)))
  12. (set! layer-count (vector-length layer-array))

  13. (set! message (string-append "Layer Name is "))

  14. (while (< layer-index layer-count)
  15. (set! layer-id (vector-ref layer-array layer-index))

  16. (set! layer-name (car (gimp-layer-get-name layer-id)))

  17. (if (> layer-index 0)
  18. (begin
  19. (set! message (string-append message " / "))
  20. )
  21. )

  22. (set! message (string-append message layer-name))

  23. (set! layer-index (+ layer-index 1))
  24. )

  25. (gimp-message message)
  26. )
  27. )

  28. (script-fu-register
  29. "myscript" ; 登録する関数の名前
  30. "My Script" ; メニュー項目のラベル
  31. "自作の練習用スクリプトです" ; メニュー項目の説明
  32. "My Name" ; 作成者の名前
  33. "My Name" ; 著作権者の名前
  34. "January 1, 2023" ; 作成日(改訂日)
  35. "RGB* GRAY*" ; メニュー項目を有効にするための条件
  36. SF-IMAGE "Image" 0 ; 画像番号
  37. )

  38. (script-fu-menu-register
  39. "myscript" ; 対象の関数の名前
  40. "<Image>/Filters" ; メニュー項目の位置
  41. )
 

修正したのは13行目で、

(set! layer-count (car(gimp-image-get-layers image)))

という行を、

(set! layer-count (vector-length layer-array))

に変更しています。 12行目で変数 layer-arrayに取得したベクタの情報件数を、変数 layer-countに格納しています。

では、修正したスクリプトを実行してみましょう。 プルダウンメニューの"フィルター(R) -> My Script"を実行します。

4. ウィンドウ下部に "Layer Name is 太陽 / 雲 / 青空" と表示される
4. ウィンドウ下部に "Layer Name is 太陽 / 雲 / 青空" と表示される

上図のようにウィンドウ下部に "Layer Name is 太陽 / 雲 / 青空" と表示されます。 修正前と同じ結果を得ることができました。

選択中のレイヤにアルファチャンネルを追加する

次に紹介するのは、手続き gimp-image-get-active-layer と gimp-layer-add-alpha の2つです。

手続き 機能
gimp-image-get-active-layer 選択中のレイヤのレイヤ番号を返す
gimp-layer-add-alpha 指定されたレイヤにアルファチャンネルを追加する

これらの手続きを利用し、選択中のレイヤにアルファチャンネルを追加するスクリプトを作成してみましょう。 スクリプトファイル myscript.scm を以下のように書き換えます。

  1. (define (myscript image)
  2. (let
  3. (
  4. (activelayer-id 0)
  5. )

  6. (set! activelayer-id (car (gimp-image-get-active-layer image)))

  7. (gimp-layer-add-alpha activelayer-id)
  8. )
  9. )

  10. (script-fu-register
  11. "myscript" ; 登録する関数の名前
  12. "My Script" ; メニュー項目のラベル
  13. "自作の練習用スクリプトです" ; メニュー項目の説明
  14. "My Name" ; 作成者の名前
  15. "My Name" ; 著作権者の名前
  16. "January 1, 2023" ; 作成日(改訂日)
  17. "RGB* GRAY*" ; メニュー項目を有効にするための条件
  18. SF-IMAGE "Image" 0 ; 画像番号
  19. )

  20. (script-fu-menu-register
  21. "myscript" ; 対象の関数の名前
  22. "<Image>/Filters" ; メニュー項目の位置
  23. )
 

解説の必要がなさそうなほど単純なスクリプトですが、一応説明しておきます。 まず、4行目の、

(activelayer-id 0)

では、変数 activelayer-idを宣言していますが、この変数は選択中のレイヤのレイヤの番号を格納するためのものです。 さらに7行目の、

(set! activelayer-id (car (gimp-image-get-active-layer image)))

で、変数activelayer-idに手続き gimp-image-get-active-layerが返す選択中のレイヤのレイヤ番号を格納しています。

9行目の、

(gimp-layer-add-alpha activelayer-id)

が、選択中のレイヤにアルファチャンネルを追加している部分です。 変数activelayer-idのレイヤにアルファチャンネルを追加しています。


では、このスクリプトを試してみましょう。

1. アルファチャンネルを持たないレイヤを含む画像を開く
1. アルファチャンネルを持たないレイヤを含む画像を開く

上図のようにアルファチャンネルを持たないレイヤを含む画像を開きます。 今回は上からアルファチャンネル あり / なし / なし の3枚のレイヤを持つ画像です。

選択されているレイヤは、2枚目のアルファチャンネル なし のレイヤです。 レイヤ名称が太字で表示されていることから判断できます。

では、スクリプトを実行しましょう。 プルダウンメニューの"フィルター(R) -> My Script"を実行します。

2. 選択中の2枚目のレイヤにアルファチャンネルが追加されている
2. 選択中の2枚目のレイヤにアルファチャンネルが追加されている

上図のように選択中の2枚目のレイヤにアルファチャンネルが追加されています。 レイヤ名称が太字ではなくなっています。

次の記事へ

長くなってきましたので、そろそろ一区切りしましょう。 続きは次の記事を参照ください

  
  

まとめ

GIMP専用の手続き(関数)は、戻り値が1つの場合も複数の場合も必ずリストで返します。 よって、手続き carや手続き cadrなどを使ってデータを取り出す必要があります。

GIMP専用の手続きの多くは、画像番号を引数として受け取ります。 よって、作成するスクリプトも引数として画像番号を受け取る必要があります。 そのためには、手続き script-fu-registerへの引数も増やす必要があります。

なお、手続き script-fu-registerへ渡す引数は、

  1. 3ずつ増える

という特徴があります。

作成するスクリプトが
受け取る引数の数
script-fu-registerへ
渡す引数の数
無し 7
1 10
2 13
3 16

スクリプトが受け取る引数の型には以下があります。

スクリプトへの引数の型 意味
SF-IMAGE 画像番号を受け渡す

画像の幅や高さを取得するには、手続き gimp-image-width と gimp-image-height を利用します。

手続き 機能
gimp-image-width 画像の幅を返す
※キャンバスの幅のこと
gimp-image-height 画像の高さを返す
※キャンバスの高さのこと

画像のレイヤの枚数およびレイヤ番号の一覧、レイヤの名称を取得するには、手続き gimp-image-get-layers と gimp-layer-get-name を利用します。

手続き 機能
gimp-image-get-layers レイヤの枚数・レイヤ番号の一覧を返す
gimp-layer-get-name レイヤ番号に対するレイヤ名称を返す

手続き gimp-image-get-active-layer で選択中のレイヤのレイヤ番号を取得することができます。 また、手続き gimp-layer-add-alpha で指定したレイヤにアルファチャンネルを追加することができます。

手続き 機能
gimp-image-get-active-layer 選択中のレイヤのレイヤ番号を返す
gimp-layer-add-alpha 指定されたレイヤにアルファチャンネルを追加する

なお、Script-Fu プロシージャブラウザーでの引数や戻り値の表記は以下のような対応になっています。

引数や戻り値の種別(データ型) 意味
INT32 数値(整数)
INT32ARRAY 数値(整数)のベクタ
STRING 文字列
IMAGE 画像番号
メニュー