GIMP2.10でScript-Fuを試してみる。

Script-Fu コンピュータ
Script-Fu

GIMP内で実行できるスクリプトは2種類あり一つはPython-Fu(Python)もう一つはScript-Fu(Scheme)です。
プラグインとしてインストールしたフィルターがScript-Fuで書かれており、そのフィルターを実行するマクロ的なスクリプトを組むためScript-Fuを試してみたいと思います。

Script-Fuで実行するスクリプトはSchemeというスクリプト言語ですが、私は学習経験がありません。
よくオープンソースのアプリケーションの組み込み言語として採用されるらしいので少しぐらいは使えるようになりたいと思います。

とはいえSchemeは元がLispらしいので、コードが()だらけで、変数の代入のようなどの言語でも概ね共通なa = 10のようなスタイルではなかったと思います。マクロ作成という比較的軽い目的で、0から言語学習をするのは、なかなかしんどいので基礎を飛ばして即実践してみたいとおもいます。

Script-Fuの対話式コンソールを立ち上げて試して行きます。

直近開いた画像のイメージオブジェクトを取得

基本的にGIMPでスクリプトを組むとするとimageオブジェクトが無いと始まらないので、画像の一覧を取得します。

(gimp-image-list)

()よくあるプログラミング言語で言うところの改行や;に相当します。
またブロックの役割もするそうです。
おのずと()だらけのスクリプトが出来上がります。

画像を1つ開いている状態での実行結果は以下のような結果になります。

>(gimp-image-list)
(1 #(1))

うん、意味が分からない。1が2つ。
Python-Fuで試した際この関数は開いている画像のimageオブジェクトの配列を返してくれたようなきがしましたが…

プロシージャブラウザでgimp-image-listを引いてみたいと思います。

返り値
num-images INT32 The number of…
image-ids INT32ARRAY The list of…

やはり戻り値が2つあるようです。英語の説明を類推するとimage-idsが配列なのでこちらがimageの配列だと思われます。
さて、この2つある戻り値うち後者を取り出すにはどうしたらよいでしょう。

(cdr (gimp-image-list))
>(#(1))

これで目的の配列を取得できました。
ちなみに一つ目を取り出すには。

(car (gimp-image-list))
>1

こちらには結果に()が無い状態ですので、直接値を表していると思われます。

(cdr (gimp-image-list))
>(#(1))

こちらの#(1)は多分、配列を表しているとすると外側の()が余分です。

(car (cdr (gimp-image-list)))
>#(1)

先ほど使ったcarで()が外れました。

次に取り出した配列の最初の要素を取り出します。

(aref (car (cdr (gimp-image-list))) 0)
>1

右側の0がインデックスになります。

ここまで実行してみて結果が数値の1に見えます。
imageオブジェクトのID番号か何かとは思いますが、今のところ考えないことにします。

とりあえず目的のimageオブジェクトが取得できたと思いますので、変数に格納しておきます。

(define img (aref (car (cdr (gimp-image-list))) 0))
img

defineで宣言し初期化していることになります。
コンソールで別なコードを実行する際、引数として利用できましたのでグローバル変数だと思われます。

イメージオブジェクトからアクティブなレイヤーを取得

imageの次はlayerを取得します。
GIMPの関数群はこの二つを引数に取るものが多いので、この2つを抑えておけば色々なことが出来るようになります。

(gimp-image-get-active-layer img)
>(2)

gimp-image-get-active-layerに先ほど取得したimageオブジェクトのimgを引数に渡します。
戻り値が数値に見えますが、多分これがlayerオブジェクトなのでしょう。

こちらも結果が()に包まれていますのでcarで外してあげます。

(car (gimp-image-get-active-layer img))
>2

先ほどと同様に変数に格納します。

(define layer(car (gimp-image-get-active-layer img)))
layer

塗りつぶし

imageとlayerが取得できたので画像を黒(前景色)で塗りつぶしてみたいと思います。

プロシージャブラウザで塗りつぶしなのでfillを検索
いくつか候補が出ますが、gimp-edit-fillを試してみたいと思います。

引数の1番目はdrawableをセットするそうなのですが、よくわからないですがlayerをセットしてみます。
2番目は塗りつぶしの種類らしく0が前景色を1が背景色のようなので、とりあえず0をセットします。

(gimp-edit-fill layer 0)
>(#t)

見慣れない結果ですが、エラーではないようです。
(#t)のtがtrueのtであることを期待して画像を見てみます。

前景色の黒で塗りつぶされています。

最後に

今回のところはこんな感じで終わりにします。
試行錯誤しましたが、結果は以下の3行になります。

(define img (aref (car (cdr (gimp-image-list))) 0))
(define layer(car (gimp-image-get-active-layer img)))
(gimp-edit-fill layer 0)

やっぱり()だらけの暗号のように見えます。

コメント