トップ > Script-Fuスクリプトの制作 >
ファイルからスクリプトを読み込ませて実行する(バージョン 3)

  
  
この記事はGIMP 3.0系のScript-Fu バージョン 3向けの記事です。 GIMP 2.10系を利用している方は、Script-Fu バージョン 2 / 3 共通の記事まで読み飛ばしてください。 または、SCript-Fu バージョン 2向けの記事まで戻ってください。

もう少し本格的なスクリプトを書く

前の記事では、Script-Fu コンソールからスクリプトを打ち込みました。 この記事ではファイルにスクリプトを保存し、それをGIMPに読み込ませることで実行させます。 スクリプトの内容は前の記事と同じで、

  1. GIMPを終了させる

というだけです。

ファイルから読み込ませたスクリプトはプルダウンメニューに組み込まれる

すでに書いた通り、この記事ではファイルからスクリプトを読み込ませて実行します。 『ファイルからスクリプトを読み込ませる』と聞いてほとんどの人が想像するのが、

  1. GIMPのプルダウンメニューから "ファイル(F) -> スクリプトを開く" のように実行
  2. 準備しておいたスクリプトファイルを指定する
  3. スクリプトが読み込まれて実行される

という流れだと思います。 しかし、残念ながら実際の手順はそうではありません。 スクリプトをファイルから読み込んで実行する手順は、

  1. スクリプトファイルを作成する
  2. 作成したスクリプトファイルをスクリプトファイル置き場に置く
  3. GIMPを起動する
  4. GIMPがスクリプトファイル置き場の全ファイルを読み込む
  5. GIMPのプルダウンメニューにそのスクリプトを実行するためのメニュー項目が追加される
  6. 追加されたプルダウンメニューのメニュー項目からスクリプトを実行する

という流れになります。

ファイルからスクリプトを読み込ませて実行する

では、ファイルからスクリプトを読み込ませて実行してみましょう。 ファイルにスクリプトを保存し、それをGIMPに読み込ませることでプルダウンメニューにメニュー項目が追加されます。 追加されたプルダウンメニューのメニュー項目からスクリプトを実行し、GIMPを終了させます。

なお、メニュー項目を追加する場所は、プルダウンメニューの"フィルター(R)"の中です

まずは、スクリプトファイルを作成します。 メモ帳などのテキストファイルを編集できるアプリケーションを開いてください

1. '(gimp-quit TRUE)'と記述
1. '(gimp-quit TRUE)'と記述

上図のようにメモ帳を開き、

  1. (gimp-quit TRUE)
 

と記述します。 前の記事でScript-Fu コンソールに打ち込んだものと同じ内容です。

では、ファイルへ保存しましょう。

2. ファイル(F) -> 上書き保存(S)を実行
2. ファイル(F) -> 上書き保存(S)を実行

上図のようにプルダウンメニューの"ファイル(F) -> 上書き保存(S)"を実行します(またはキーボードのCTRL+Sを押します)。

3. 名前を付けて保存ダイアログ
3. 名前を付けて保存ダイアログ

上図のように『名前を付けて保存』ダイアログが開きますので、(1)のファイル名(N)に "myscript.scm" を指定し、(2)の文字コード(E)に UTF-8 を選択し、(3)の[保存(S)]ボタンを押します。

  
Script-Fuのスクリプトファイルは、拡張子を ".scm" にする必要があります。
  
Script-Fuのスクリプトファイルは、文字コード(文字エンコードのこと)が UTF-8 でなければなりません。 UTF-8 でない場合には、スクリプト実行時に表示メッセージなどが文字化けしてしまいます。

ファイルへ保存したらメモ帳は閉じて終了し、エクスプローラを開いて保存されたファイルを確認してみましょう。

  
メモ帳はここで必ず終了しておいてください。 この後の説明の都合上、ここでメモ帳を閉じている必要があります。
4. テキストファイルとして保存されている
4. テキストファイルとして保存されている

上図のように "テキスト ドキュメント" として保存されています。 拡張子を ".scm" にして保存したのにテキストファイルとして保存されてしまいました。

これは、メモ帳が "myscript.scm.txt" というファイル名で文書を保存してしまったためです。 つまり、".txt" が自動的に足されたということです

  
メモ帳が文書を "myscript.scm.txt" として保存したのはメモ帳として正しい振る舞いです。

というわけですので、次の作業はファイル名を "myscript.scm.txt" から "myscript.scm" に変更する作業です。

ただし、Windowsの標準設定では利用者が拡張子を操作することはできません。 まずは、拡張子を操作できるようにする必要があります

5. 表示タブ -> オプションを実行
5. 表示タブ -> オプションを実行

上図のようにエクスプローラを開き、上部のメニューにある"表示タブ -> オプション"を実行します。

6. フォルダーオプション
6. フォルダーオプション

上図のようにフォルダーオプションが開きます。 この画面で、フォルダやファイルの表示に関する設定を調整することができます。

7. 登録されている拡張子も表示させる
7. 登録されている拡張子も表示させる

上図のように(1)の表示タブに切り替え、(2)の "登録されている拡張子は表示しない" のチェックを外し、(3)の[OK]ボタンを押します。

8. 拡張子を含んだファイル名が表示される
8. 拡張子を含んだファイル名が表示される

上図のように拡張子も含めたファイル名が表示されるようになりました。 これで、拡張子を操作することができます。

では、ファイル名を "myscript.scm.txt" から "myscript.scm" に変更してください

9. 拡張子を変更しようとすると警告が表示されるが問題ない
9. 拡張子を変更しようとすると警告が表示されるが問題ない

上図のように拡張子を変更しようとすると警告が表示されます。 問題はありませんので[はい(Y)]ボタンを押して続行してください。

10. 拡張子が ".scm" になった
10. 拡張子が ".scm" になった

上図のように拡張子が ".scm" になりました。 これで、GIMPがスクリプトファイルとして認識してくれるようになります

では、この "myscript.scm" ファイルをスクリプトファイル置き場に移動させましょう。 まずは、スクリプトファイル置き場がどこなのか、つまり、GIMPがどのフォルダにスクリプトファイルを探しに行くのかを調べましょう。

GIMPの設定ウィンドウを開きます。

11. 編集(E) -> 設定(P)を実行
11. 編集(E) -> 設定(P)を実行

上図のようにプルダウンメニューの"編集(E) -> 設定(P)"を実行します。

12. GIMPの設定
12. GIMPの設定

上図のようにGIMPの設定ウィンドウが表示されます。 なお、ウィンドウの左側の一覧が設定項目の分類です。

ウィンドウの左側の一覧からフォルダー -> スクリプトを選択します。

13. スクリプト用フォルダを確認する
13. スクリプト用フォルダを確認する

上図のようにスクリプト用フォルダの一覧が表示されます。 今回の例では2行が表示されていますが、それぞれの意味は以下の通りです。

No フォルダ 説明
(1) C:\Users\<ユーザID>\
AppData\Roaming\
GIMP\3.0\scripts
自分専用のスクリプト
(2) C:\Program Files\
GIMP 3\share\
gimp\3.0\scripts
全ユーザで使えるスクリプト

では、作成したスクリプトファイル "myscript.scm" を調査したフォルダに配置してください。

  
(1)・(2)のどのフォルダでも構いませんが、以下の例では(1)の自分専用のスクリプトファイル置き場へ配置したものとして解説しています。
14. "myscript.scm" を(1)の自分専用のスクリプトファイル置き場へ移動する
14. "myscript.scm" を(1)の自分専用のスクリプトファイル置き場へ移動する

上図のように(1)の自分専用のスクリプトファイル置き場へ "myscript.scm" を移動します。

スクリプトを配置したら、GIMPを再起動しましょう。 起動したら、プルダウンメニューの"フィルター(R)"の中のメニュー項目を見てみましょう。

  
PCによっては起動せずに終了すると思います。 この時点ではそれで正常ですので、このまま読み進めてください。
15. メニュー項目には変化がない
15. メニュー項目には変化がない

上図のようにプルダウンメニューの"フィルター(R)"の中のメニュー項目には変化ありません。 理由はもちろん、スクリプトファイルの記述に間違いがあるからです

この記事の最初で解説したように、ファイルからスクリプトを読み込ませるとプルダウンメニューにメニュー項目が追加されます。 プルダウンメニューにメニュー項目が追加されるということは、

  1. プルダウンメニューのどの位置にメニュー項目を表示させるか
  2. メニュー項目のラベルに何と表記するのか

などの情報も必要になります。 しかし、現状ではスクリプトファイルには、

(gimp-quit TRUE)

としか書かれていません。 これでは情報が足りていません。 ファイルからスクリプトを読み込ませる場合は、もっと色々と記述をしなくてはならないのです

というわけで、スクリプトファイルには修正が必要です。 さっそく、修正しましょう。

16. ファイル(F) -> 開く(O)...を実行
16. ファイル(F) -> 開く(O)...を実行

上図のように再度メモ帳を開き、プルダウンメニューの"ファイル(F) -> 開く(O)"を実行します(またはキーボードのCTRL+Oを押します)。

17. スクリプトファイルが表示されない
17. スクリプトファイルが表示されない

上図のように "myscript.scm" を配置した場所へ移動してもファイルは見つかりません。 先ほど拡張子を ".scm" に変更したためです

では、テキストファイルだけでなく、全てのファイルをメモ帳で開けるようにしましょう。

18. ファイルの種類を "すべてのファイル (*.*)" に変更する
18. ファイルの種類を "すべてのファイル (*.*)" に変更する

上図のようにファイルの種類を "すべてのファイル (*.*)" に変更します。

19. スクリプトファイルも表示されるようになる
19. スクリプトファイルも表示されるようになる

上図のようにスクリプトファイル "myscript.scm" も表示されるようになりましたので開きましょう。

20. ファイルが開かれて編集可能な状態になる
20. ファイルが開かれて編集可能な状態になる

上図のようにスクリプトファイルが読み込まれ、編集可能な状態になります。 では、このスクリプトファイルを以下のように書き換えましょう。

  1. (define (myscript)
  2. (gimp-quit TRUE)
  3. )

  4. (script-fu-register-procedure
  5. "myscript"
  6. "My Script"
  7. "自作の練習用スクリプトです"
  8. "My Name"
  9. "January 1, 2023"
  10. )

  11. (script-fu-menu-register
  12. "myscript"
  13. "<Image>/Filters"
  14. )
 
  
6行目から10行目および14・15行目には、先頭と末尾に二重引用符 (") があります。 つまり、二重引用符で囲まれています。 これには大切な意味がありますので、忘れずに入力してください。 二重引用符の意味については、別の記事で詳しく解説します。

変更したらファイルへ保存し、GIMPを起動してください。 起動したら、プルダウンメニューの"フィルター(R)"の中のメニュー項目を確認します。

21. 新たなメニュー項目が増えている
21. 新たなメニュー項目が増えている

上図のようにプルダウンメニューの "フィルター(R)" の最下部に "My Script" というメニュー項目が追加されています

  
メニュー項目が追加されていない場合はスクリプトファイルの内容に間違いがあります。 スクリプトファイルの内容を見直してください。

メニュー項目がプルダウンメニューの "フィルター(R)" の下に追加されたのはスクリプトの15行目の、

"<Image>/Filters"

という記述によるものです。

  
"<Image>" が画像ウィンドウのプルダウンメニューを意味し、"Filters" が "フィルター(R)" を意味しています。

また、メニュー項目のラベルの "My Script" という名前はスクリプトの7行目の、

"My Script"

という記述によるものです。

ではここで、増えたメニュー項目の "My Script" にマウスカーソルを乗せ、しばらく乗せたままにしてください

22. メニュー項目の説明を見ることができる
22. メニュー項目の説明を見ることができる

上図のようにメニュー項目の説明が表示されます。 これは、スクリプトの8行目に、

"自作の練習用スクリプトです"

と記述した結果です。

  
メニュー項目の説明が文字化けする場合は、スクリプトファイルの文字コードが UTF-8 になっていることを再確認してください。

では、さっそく追加されたメニュー項目 "My Script" を実行してみましょう。

23. フィルター(R) -> My Scriptを実行
23. フィルター(R) -> My Scriptを実行

上図のようにプルダウンメニューの"フィルター(R) -> My Script"を実行します。 実行した直後に、GIMPが終了したはずです

やりました、ファイルからスクリプトを読み込ませて実行することができました

スクリプトの解説

ではここで、今回のスクリプトについて解説します。

  1. (define (myscript)
  2. (gimp-quit TRUE)
  3. )

  4. (script-fu-register-procedure
  5. "myscript"
  6. "My Script"
  7. "自作の練習用スクリプトです"
  8. "My Name"
  9. "January 1, 2023"
  10. )

  11. (script-fu-menu-register
  12. "myscript"
  13. "<Image>/Filters"
  14. )

まず、このスクリプトには3つの命令があることがわかります。 手続き defineから成る命令と、手続き script-fu-register-procedureから成る命令と、手続き script-fu-menu-registerから成る命令です。 それぞれの手続きの詳細は以下の通りです。

手続き define

手続き defineは独自の手続きを定義するためのものです。 つまり、自分のためだけの機能を持つ手続きを作ることができるのです。

  
前の記事で説明したように、手続きは関数・演算子・制御文などに分類することができます。 独自の手続きは関数に分類されますので、これ以降は『独自の手続き』のことを『関数』と表記します。

なお、この命令は、

(define (myscript)
    (gimp-quit TRUE)
)

のように3行で記述されていますが、これは人間が理解しやすいように行を分けているだけです。 次のように、

(define (myscript)(gimp-quit TRUE))

と、1行で記述しても同じ動作になります

また、2行目の先頭の空白を取り除いて、

(define (myscript)
(gimp-quit TRUE)
)

と記述しても、動作は変わりません。 2行目の先頭の空白も、同じく人間が理解しやすいようにするためのものです。

  
先頭に空白(またはタブ)を入れて開始位置を下げることを『字下げ』や『インデント』と呼びます。 人間がプログラムの内容を読みやすくするための手法です。

では、この命令を詳しく見てみましょう。 まず、手続き defineは2つの引数を受け取っています。 "(myscript)" と "(gimp-quit TRUE)" です。

最初の引数 "(myscript)" はカッコで囲まれていますが、この部分は命令ではありません。 手続き defineを使って関数を定義する場合は、最初の引数には関数の名前をカッコで囲んだものを渡すという決まりがあります。 つまり、関数の名前は myscript である、という宣言をしていることになります。

2番目の引数 "(gimp-quit TRUE)" は関数 myscript が実行する命令です。 つまり、関数 myscript が実行されると、さらに手続き(関数) gimp-quitが実行されるということです。

  
手続き gimp-quitも関数に分類されます。

なお、関数の中で実行できる命令は1つだけではありません。 いくつでも好きなだけの命令を実行するこができます。 例えば以下のように、

(define (myscript)
    (gimp-message "こんにちは!!")
    (gimp-quit TRUE)
)

と記述すれば、

  1. "こんにちは!!" というメッセージを表示する
  2. GIMPを強制的に終了する

という2つの処理が行われます。

手続き script-fu-register-procedure

手続き script-fu-register-procedureは、定義した関数をScript-Fuスクリプトとして登録するためのものです。

なお、この命令は、

(script-fu-register-procedure
    "myscript"
    "My Script"
    "自作の練習用スクリプトです"
    "My Name"
    "January 1, 2023"
)

のように、引数を5つ受け取っていることがわかります。 それぞれの引数の意味は以下の通りです。

No. 意味 今回の例
1. 登録する関数の名前 "myscript"
2. メニュー項目のラベル "My Script"
3. メニュー項目の説明 "自作の練習用スクリプトです"
4. 作成者の名前 "My Name"
5. 作成日
※改訂した場合は改訂日
"January 1, 2023"
  
上記の5つの引数は二重引用符で囲まれています。 これには大切な意味があります。 二重引用符の意味については、別の記事で詳しく解説します。

なお、この命令も、

(script-fu-register-procedure
    "myscript" "My Script" "自作の練習用スクリプトです" "My Name" "January 1, 2023"
)

のように引数を1行でまとめて記述しても動作します。 また、次のように、

(script-fu-register-procedure
    "myscript" "My Script" "自作の練習用スクリプトです"
"My Name" "January 1, 2023"
)

と、引数を2行に分けて記述し、さらに引数の2行目の先頭の空白を省略しても同じ動作になります。

手続き script-fu-menu-register

手続き script-fu-menu-registerは、定義した関数をプルダウンメニューのメニュー項目に追加するためのものです。

なお、この命令は、

(script-fu-menu-register
    "myscript"
    "<Image>/Filters"
)

のように、引数を2つ受け取ります。 これらの引数の意味は以下の通りです。

No. 意味 今回の例
1. 対象の関数の名前 "myscript"
2. メニュー項目の位置 "<Image>/Filters"
  
手続き script-fu-menu-registerの最初の引数は、手続き script-fu-register-procedureの最初の引数と同じものを渡すことになります。
  
上記の2つの引数は二重引用符で囲まれています。 これには大切な意味があります。 二重引用符の意味については、別の記事で詳しく解説します。

GIMP起動時と追加されたメニュー項目の実行時に何が行われているのか

GIMP起動時と追加されたメニュー項目の実行時に何が行われているのかを解説しておきます。

GIMP起動時に行われること

GIMPを起動すると、スクリプトファイル置き場に置かれているスクリプトファイル(myscript.scm)が読み込まれ、

(define (myscript)
    (gimp-quit TRUE)
)

という記述により、独自の関数 myscriptが定義されます。 『関数 myscript が実行されると、さらに手続き gimp-quitが実行される』という内容が定義されます。

ただし、まだスクリプトとして利用することはできません。 Script-Fu コンソールから実行することはできませんし、プルダウンメニューから実行することもできません。

続いて、

(script-fu-register-procedure
    "myscript"
    "My Script"
    "自作の練習用スクリプトです"
    "My Name"
    "January 1, 2023"
)

の部分が実行され、定義済みの関数 myscriptがScript-Fuスクリプトとして登録されます。 その結果、Script-Fu コンソールから実行することができるようになります。 ただし、プルダウンメニューにはまだ追加されていません。

最後に、

(script-fu-menu-register
    "myscript"
    "<Image>/Filters"
)

の部分が実行され、プルダウンメニューに "My Script" というメニュー項目が追加されます。 プルダウンメニューからも実行することができるようになります。

追加されたメニュー項目を実行した時に起こること

利用者がプルダウンメニューの"フィルター(R) -> My Script"を実行することで、関数 myscript が実行されます。

(GIMP起動時に定義された通りに)関数 myscriptの内部では、さらに手続き gimp-quitが実行されます。 つまり、GIMPが終了します。

  

二重引用符について

すでに書いたように、手続き script-fu-register-procedureと手続き script-fu-menu-registerの引数は、

(script-fu-register-procedure
    "myscript"
    "My Script"
    "自作の練習用スクリプトです"
    "My Name"
    "January 1, 2023"
)

や、

(script-fu-menu-register
    "myscript"
    "<Image>/Filters"
)

のように引数の全てが二重引用符 (") で囲まれています。 二重引用符で囲まれていることには重要な意味があります。

ただし、今はまだその理由を知る必要はありません。 詳細については別の記事で後ほど説明しますので、今は、

  1. 手続き script-fu-register-procedureの引数は " で囲む必要がある
  2. 手続き script-fu-menu-registerの引数も " で囲む必要がある

とだけ覚えておいてください。

  

まとめ

ファイルからスクリプトを読み込ませて実行する場合には、スクリプトファイル置き場にスクリプトファイルを配置します。 スクリプトファイル置き場は、GIMPの設定ウィンドウで確認することができます。

GIMP起動時にスクリプトファイル置き場からスクリプトファイルが読み込まれ、プルダウンメニューのメニュー項目に追加されます。

スクリプトファイルは文字コード UTF-8 で記述されている必要があり、拡張子は ".scm" でなければなりません。

また、スクリプトファイルは3つの命令から構成されている必要があります。 手続き defineから成る命令と、手続き script-fu-register-procedureから成る命令と、手続き script-fu-menu-registerから成る命令です。

手続き defineで独自の関数を定義し、手続き script-fu-register-procedureでScript-Fuスクリプトとして登録し、手続き script-fu-menu-registerでプルダウンメニューのメニュー項目に追加します。

手続き 説明
define 独自の関数を定義する
script-fu-register-procedure 定義した関数をScript-Fuスクリプトとして登録
script-fu-menu-register 定義した関数をプルダウンメニューのメニュー項目に追加
メニュー