トップ > Script-Fuスクリプトの制作 >
ファイルからスクリプトを読み込ませて実行する

  

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

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

  1. GIMPを終了させる

というだけです。

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

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

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

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

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

という流れになります。

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

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

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

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\2.10\scripts
自分専用のスクリプト
(2) C:\Program Files\
GIMP 2\share\
gimp\2.0\scripts
全ユーザで使えるスクリプト

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

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

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

スクリプトを配置したら、GIMPを再起動しましょう

15. エラーが発生してGIMPは起動しない
15. エラーが発生してGIMPは起動しない

上図のようにエラーが発生し、GIMPは起動しないはずです。 起動しない理由は、スクリプトファイルの記述に間違いがあるからです

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

  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
  5. "myscript"
  6. "My Script"
  7. "自作の練習用スクリプトです"
  8. "My Name"
  9. "My Name"
  10. "January 1, 2023"
  11. "RGB* GRAY*"
  12. )

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

変更したらファイルへ保存し、GIMPを起動してください

21. GIMPが正常に起動する
21. GIMPが正常に起動する

上図のようにGIMPは正常に起動するはずです。

  
起動しない場合はスクリプトファイルの内容に間違いがあります。 スクリプトファイルの内容を見直してください。

GIMPが無事に起動したらプルダウンメニューに注目してください

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

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

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

"<Image>/Filters"

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

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

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

"My Script"

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

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

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

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

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

と記述した結果です。

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

ではここで、追加されたメニュー項目 "My Script" に注目してください。 何かがおかしいです

24. メニュー項目は暗くて実行できない
24. メニュー項目は暗くて実行できない

上図のようにメニュー項目が暗くなっており、実行することができません。 せっかくメニュー項目の追加までこぎつけたのに、実行できないなんて。

メニュー項目が無効になっているのは、スクリプトの12行目の、

"RGB* GRAY*"

という記述の影響です。 ここにはメニュー項目を有効にするための条件を記述します

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

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

よって、まだスクリプトの修正が必要だということです。 画像を開いていない状態でもメニュー項目が有効になるように修正します。 以下のように修正し、忘れずに保存してください。

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

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

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

修正したのは12行目で、

"RGB* GRAY*"

を、

""

に変更しています。

では、スクリプトの変更をGIMPに反映させましょう。 ただし、GIMPの再起動は行いません

GIMPを再起動せずにスクリプトファイルを再読み込みさせることができます。

25. フィルター(R) -> Script-Fu(S) -> スクリプトを再読み込み(R)を実行
25. フィルター(R) -> Script-Fu(S) -> スクリプトを再読み込み(R)を実行

上図のようにプルダウンメニューの"フィルター(R) -> Script-Fu(S) -> スクリプトを再読み込み(R)"を実行します。

26. メニュー項目が明るくなった
26. メニュー項目が明るくなった

上図のようにメニュー項目が明るくなりました。 スクリプトの変更がGIMPに反映されたためです。

では、さっそく実行してみましょう。

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

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

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

スクリプトの解説

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

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

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

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

まず、このスクリプトには3つの命令があることがわかります。 手続き defineから成る命令と、手続き script-fu-registerから成る命令と、手続き 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

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

なお、この命令は、

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

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

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

なお、この命令も、

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

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

(script-fu-register
    "myscript" "My Script" "自作の練習用スクリプトです"
"My Name" "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の最初の引数と同じものを渡すことになります。
  
上記の2つの引数は二重引用符で囲まれています。 これには大切な意味があります。 二重引用符の意味については、別の記事で詳しく解説します。

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

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

GIMP起動時に行われること

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

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

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

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

続いて、

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

の部分が実行され、定義済みの関数 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と手続き script-fu-menu-registerの引数は、

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

や、

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

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

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

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

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

  

Script-Fuスクリプトの登録方法には2通りある

Script-Fuスクリプトを登録する方法には、実は新旧の2通りの記述方法があります。 本ウェブサイトで紹介している以下の記述方法は新しい記述方法です

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

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

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

ネットで見かけるサンプル等では、古い記述方法の方をよく見かけるように感じます。 古い記述方法では、手続き script-fu-registerだけで、

  1. 定義した関数をScript-Fuスクリプトとして登録する
  2. 定義した関数をプルダウンメニューのメニュー項目に追加する

の2つを処理していました。 具体的には、

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

  4. (script-fu-register
  5. "myscript"
  6. "<Image>/Filters/My Script"
  7. "自作の練習用スクリプトです"
  8. "My Name"
  9. "My Name"
  10. "January 1, 2023"
  11. "RGB* GRAY*"
  12. )

という記述を行っていました。 手続き script-fu-registerの2つ目の引数で、

  1. メニュー項目の位置
  2. メニュー項目のラベル

の両方を指定していたのです。

  
古い記述方法では、手続き script-fu-menu-registerは登場しません。

近い将来リリース予定のGIMP 3系での変更点について

近い将来リリースが予定されているGIMP 3系では、古い記述方法は通用しなくなります。 GIMP 3系からは新しい記述方法しか受け付けてくれなくなります

  

まとめ

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

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

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

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

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

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

なお、手続き script-fu-menu-registerを利用しない古い記述方法もあります。 ただし、古い記述方法は近い将来リリースが予定されているGIMP 3系では通用しなくなります。

 
メニュー