トップ > 特集 >
Script-Fu バージョン 2 から 3 への移行の手順

  

GIMP 2.10系までのScript-Fu スクリプトをGIMP 3.0系で動作させるには

GIMP 3.0系でScript-Fuのバージョンが 2 から 3 に上り、仕様が大幅に変更されました。 Script-Fu バージョン 2のスクリプトは、そのままではGIMP 3.0系ではほとんどのものが動作しません

  
筆者が制作した GIMP 2.8系 / 2.10系用のスクリプトは全滅でした。 GIMP 3.0系ではどのスクリプトも動きませんでした。

この記事で解説していること

この記事では、筆者が制作した Script-Fu バージョン 2のスクリプトを、バージョン 3に対応させるために実施した手順を紹介しています。 なお、スクリプトの機能的な改善は行いません『とりあえず動けばいい』ということを目指しています。

そのため、複数レイヤを選択している場合には期待通りの結果にはなりません。 選択中のいくつかのレイヤの中で、どれか1つだけにしか処理は適用されません

また、非推奨となってしまった TRUE と FALSE に関する部分にも修正は入れません。

つまり、『将来的に動かなくなる可能性はありますが、選択されているレイヤの数が1つだけの時には今までどおりに動きますよ』というだけの修正です。

  

Script-Fu バージョン 3に対応させるために実施した手順

では、スクリプトをScript-Fu バージョン 3に対応させるために行った作業を紹介します。

  
なお、修正後のスクリプトは GIMP 2.10系や2.8系では動作しなくなります。 修正前にバックアップを取っておきましょう

手順(1) script-fu-menu-registerの利用

まずは、Script-Fuスクリプトの登録方法を見直す必要があります。 Script-Fuスクリプトを登録する方法には、新旧の2通りの記述方法があります。

GIMP 3.0系では古い記述方法は使えません。 古い方法で記述している場合は、こちらの記事を参考に新しい記述方法に書き換えてください

修正前
  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. )
修正後
  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. )

手順(2) SF-IMAGEを受け取らない関数の script-fu-register から script-fu-register-procedure への切り替え

手続き script-fu-register から script-fu-register-procedure へ切り替えます。 対象は、SF-IMAGE型の引数を受け取っていない関数です。

なお、5番目の引数である "著作権者の名前" と7番目の引数である "メニュー項目を有効にするための条件" は不要ですので削除してください

修正前
  1. (script-fu-register
  2. "myscript"
  3. "My Script"
  4. "自作の練習用スクリプトです"
  5. "My Name"
  6. "My Name"
  7. "January 1, 2023"
  8. "RGB* GRAY*"
  9. )
修正後
  1. (script-fu-register-procedure
  2. "myscript"
  3. "My Script"
  4. "自作の練習用スクリプトです"
  5. "My Name"
  6. "January 1, 2023"
  7. )

手順(3) SF-IMAGEを受け取る関数の script-fu-register から script-fu-register-filter への切り替え

手続き script-fu-register から script-fu-register-filter へ切り替えます。 対象は、SF-IMAGE型の引数を受け取っている関数です。

なお、引数の数は変わりません。

修正前
  1. (script-fu-register
  2. "myscript"
  3. "My Script"
  4. "自作の練習用スクリプトです"
  5. "My Name"
  6. "My Name"
  7. "January 1, 2023"
  8. "RGB* GRAY*"
  9. SF-IMAGE "Image" 0
修正後
  1. (script-fu-register-filter
  2. "myscript"
  3. "My Script"
  4. "自作の練習用スクリプトです"
  5. "My Name"
  6. "My Name"
  7. "January 1, 2023"
  8. "RGB* GRAY*"
  9. SF-IMAGE "Image" 0

手順(4) SF-IMAGE から SF-ONE-DRAWABLE への置き換え

引数の型 SF-IMAGE を SF-ONE-DRAWABLE に置き換えます。 対象は、SF-IMAGE型の引数を受け取っている関数です。

修正前
  1. (script-fu-register-filter
  2. "myscript"
  3. "My Script"
  4. "自作の練習用スクリプトです"
  5. "My Name"
  6. "My Name"
  7. "January 1, 2023"
  8. "RGB* GRAY*"
  9. SF-IMAGE "Image" 0
修正後
  1. (script-fu-register-filter
  2. "myscript"
  3. "My Script"
  4. "自作の練習用スクリプトです"
  5. "My Name"
  6. "My Name"
  7. "January 1, 2023"
  8. "RGB* GRAY*"
  9. SF-ONE-DRAWABLE

手続き script-fu-register では 画像ID(SF-IMAGE) は必須ではありませんでした。 そのため、引数の数合わせのための "Image" と 0 という無駄な引数を渡していました。

一方、手続き script-fu-register-filter では SF-ONE-DRAWABLE は必須です。 そのため、数合わせのための引数は必要なくなりました

手順(5) 関数で受け取る引数の追加

関数が受け取る引数を追加します。 対象は、SF-ONE-DRAWABLE型の引数を受け取っている関数です。 つまり、SF-IMAGE型の引数を受け取っていた関数です。

Script-Fu バージョン 3では、SF-ONE-DRAWABLE型の引数には 画像ID + レイヤ番号(ベクタ) が渡ってくるようです。

修正前
  1. (define (myscript iamge)
  2. (gimp-quit TRUE)
  3. )
修正後
  1. (define (myscript iamge layers)
  2. (gimp-quit TRUE)
  3. )
  
増えた引数はレイヤ番号が格納されているベクタのようですが、詳しいことはわかりません。
  
対象の関数が他のスクリプトから呼び出されている場合には、そちらの呼び出し側の引数も忘れずに修正しておきましょう。

手順(6) 引数の型SF-VALUEの置き換え

引数の型 SF-VALUE は廃止されましたので、SF-ADJUSTMENTに置き換えます。

修正前
  1. SF-VALUE "Enter Number 1" "20"
修正後
  1. SF-ADJUSTMENT "Enter Number 1" '(20 0 9999 1 10 0 SF-SPINNER)

手順(7) 引数の型SF-BRUSHの仕様変更への対応

SF-BRUSH型の引数を変更します。 Script-Fu バージョン 2までは、SF-BRUSH型の引数は ブラシ名 / 不透明度 / 間隔 / 描画モードのリストでした。 Script-Fu バージョン 3からは、ブラシ名のみになりました。

修正前
  1. SF-BRUSH "Brush" '("2. Hardness 025" 100 5 0)
修正後
  1. SF-BRUSH "Brush" "2. Hardness 025"

もちろん、関数側に渡される引数もリストではなくなっています。 そのため、以下のような修正も必要になります。

修正前
  1. (define (myscript iamge layers brush)
  2. .
  3. .
  4. (省略)
  5. .
  6. .
  7. (gimp-context-set-brush (car brush))
  8. .
  9. .
  10. (省略)
  11. .
  12. .
修正後
  1. (define (myscript iamge layers brush)
  2. .
  3. .
  4. (省略)
  5. .
  6. .
  7. (gimp-context-set-brush brush)
  8. .
  9. .
  10. (省略)
  11. .
  12. .

手順(8) 定数名の置き換え

定数名の置き換えを行います。 単純に定数名を置き換えるだけで済みます。 筆者が制作したスクリプト内では以下が対象でした。

修正前 修正後
FOREGROUND-FILL FILL-FOREGROUND
BACKGROUND-FILL FILL-BACKGROUND
修正前
  1. (gimp-edit-fill framelayer-id FOREGROUND-FILL)
修正後
  1. (gimp-edit-fill framelayer-id FILL-FOREGROUND)

手順(9) API関数の置き換え

ここからは、API関数の変更に関する修正に入ります。 まずは、API関数の関数名の単純な置き換えを行います。 引数や戻り値の変更がなく、関数名を置き換えるだけで済むものが対象です。

筆者が制作したスクリプト内では以下が対象でした。

修正前 修正後
gimp-image-width gimp-image-get-width
gimp-image-height gimp-image-get-height
gimp-image-get-filename gimp-image-get-file
gimp-layer-get-name gimp-item-get-name
gimp-layer-set-name gimp-item-set-name
gimp-item-is-text-layer gimp-item-id-is-text-layer
gimp-image-scale-full gimp-image-scale
gimp-edit-stroke gimp-drawable-edit-stroke-selection
gimp-edit-fill gimp-drawable-edit-fill
gimp-crop gimp-image-crop
gimp-image-get-vectors-by-name gimp-image-get-path-by-name
plug-in-gauss script-fu-tile-blur

手順(10) API関数の置き換えと引数の追加

続いて、新たに引数が追加されたAPI関数に関する修正です。 戻り値には変更がないものが対象です。

筆者が制作したスクリプト内では以下が対象でした。

修正前 修正後
gimp-image-add-layer gimp-image-insert-layer
修正前
  1. (gimp-image-add-layer image layer position)
修正後
  1. (gimp-image-insert-layer image layer 0 position)
  
関数名が変更され、引数に親レイヤ番号が追加されています。

手順(11) API関数への引数の位置の入れ替え

次に、引数の位置の入れ替わりが発生したAPI関数に関する修正です。 引数の個数・戻り値には変更がなく、引数の位置が入れ替わっただけのものが対象です。

筆者が制作したスクリプト内では以下が対象でした。

対象の関数
gimp-layer-new
修正前
  1. (gimp-layer-new image width height 1 "塗りつぶし" 100 0)
修正後
  1. (gimp-layer-new image "塗りつぶし" width height 1 100 0)
  
関数名はそのままで、レイヤ名を渡す引数の位置が変わりました。

手順(12) API関数への引数のベクタへの変換

続いては、引数の一部をベクタに変換する必要があるAPI関数に関する修正です。 引数の個数・戻り値には変更がなく、一部の引数の型がベクタになっただけのものが対象です。

  
Script-Fu バージョン 3からは、GIMP 3.0系での複数レイヤの選択に合わせて仕様変更が行われています。 これまで1つのレイヤ番号しか受け取らなかったAPI関数が、複数のレイヤ番号を受け取るように仕様変更されているのです。

まずは、関数名の置き換えが必要ないものから紹介します。 筆者が制作したスクリプト内では以下が対象でした。

対象の関数
gimp-edit-cut
script-fu-drop-shadow
修正前
  1. (gimp-edit-cut layer-id)
修正後
  1. (gimp-edit-cut (vector layer-id))
  
関数名はそのままで、レイヤ番号をベクタ型で渡すように変更されています。

修正前
  1. (script-fu-drop-shadow image layer-id 0 0 10 10 60 FALSE)
修正後
  1. (script-fu-drop-shadow image (vector layer-id) 0 0 10 10 60 FALSE)
  
関数名はそのままで、レイヤ番号をベクタ型で渡すように変更されています。

次に、関数名の置き換えも必要となるものを紹介します。 筆者が制作したスクリプト内では以下が対象でした。

修正前 修正後
gimp-image-set-active-layer gimp-image-set-selected-layers
修正前
  1. (gimp-image-set-active-layer image layer-id)
修正後
  1. (gimp-image-set-selected-layers image (vector layer-id))
  
関数名が変更され、レイヤ番号をベクタ型で渡すように変更されています。

手順(13) API関数からの戻り値の変更への対応

続いて、関数からの戻り値が変更されたAPI関数に関する修正です。 正確には関数からの戻り値は以前のままの1つのリストですが、そのリストの内容が変化しています。 変更内容はさまざまですので、それぞれについて以下で紹介します。

まずは、データ件数を返さなくなったAPI関数の修正です。 つまり、戻り値として返されるリストの中の要素数が減っています。 筆者が制作したスクリプト内では以下が対象でした。

対象の関数
gimp-image-get-layers
gimp-file-load-layers
file-glob
修正前
  1. (set! layer-array (cadr (gimp-image-get-layers image)))
  2. (set! layer-count (car (gimp-image-get-layers image)))
修正後
  1. (set! layer-array (car (gimp-image-get-layers image)))
  2. (set! layer-count (vector-length (car (gimp-image-get-layers image))))
  
戻り値のリストの1件目がレイヤ数で2件目がベクタ型のレイヤ一覧でしたが、レイヤ数は返されなくなりました。 関数名はそのままです。

修正前
  1. (set! layer-array (cadr (gimp-file-load-layers 0 image jpgfilename)))
  2. (set! layer-count (car (gimp-file-load-layers 0 image jpgfilename)))
修正後
  1. (set! layer-array (car (gimp-file-load-layers 0 image jpgfilename)))
  2. (set! layer-count (vector-length (car (gimp-file-load-layers 0 image jpgfilename))))
  
戻り値のリストの1件目がレイヤ数で2件目がベクタ型のレイヤ一覧でしたが、レイヤ数は返されなくなりました。 関数名はそのままです。

修正前
  1. (if (= (length (cadr (file-glob "/etc/hosts" 1))) 0)
  2. (begin
  3. (set! filepattern (string-append directory "\\*.xcf"))
  4. )
  5. (begin
  6. (if (not (string=? (substring directory (- (string-length directory) 1) (- (string-length directory) 0)) "/"))
  7. (begin
  8. (set! directory (string-append directory "/"))
  9. )
  10. )

  11. (set! filepattern (string-append directory "*.xcf"))
  12. )
  13. )

  14. ; (gimp-message filepattern)

  15. (set! matchedfilelist (cadr (file-glob filepattern 1)))

  16. (while (not (null? matchedfilelist))
  17. (set! matchedxcffile (car matchedfilelist))

  18. (set! image (car (gimp-file-load RUN-NONINTERACTIVE matchedxcffile matchedxcffile)))

  19. (set! drawable (car (gimp-image-get-active-layer image)))

  20. (gimp-file-save RUN-NONINTERACTIVE image (car (gimp-image-get-active-layer image)) (car (gimp-image-get-filename image)) (car (gimp-image-get-filename image)))

  21. (gimp-image-delete image)

  22. (set! matchedfilelist (cdr matchedfilelist))
  23. )
修正後
  1. (if (= (length (car (file-glob "/etc/hosts" 1))) 0)
  2. (begin
  3. (set! filepattern (string-append directory "\\*.xcf"))
  4. )
  5. (begin
  6. (if (not (string=? (substring directory (- (string-length directory) 1) (- (string-length directory) 0)) "/"))
  7. (begin
  8. (set! directory (string-append directory "/"))
  9. )
  10. )

  11. (set! filepattern (string-append directory "*.xcf"))
  12. )
  13. )

  14. ; (gimp-message filepattern)

  15. (set! matchedfilelist (car (file-glob filepattern 1)))

  16. (while (not (null? matchedfilelist))
  17. (set! matchedxcffile (car matchedfilelist))

  18. (set! image (car (gimp-file-load RUN-NONINTERACTIVE matchedxcffile matchedxcffile)))

  19. (set! drawable (vector-ref (car (gimp-image-get-selected-layers image)) 0))

  20. (gimp-file-save RUN-NONINTERACTIVE image (car (gimp-image-get-file image)) "")

  21. (gimp-image-delete image)

  22. (set! matchedfilelist (cdr matchedfilelist))
  23. )
  
戻り値のリストの1件目がファイル数で2件目がベクタ型のファイル一覧でしたが、ファイル数は返されなくなりました。 関数名はそのままです。

次に、返されるデータが1件から複数に変更されたAPI関数の修正です。 筆者が制作したスクリプト内では以下が対象でした。

対象の関数
gimp-image-get-active-layer
修正前
  1. (car (gimp-image-get-active-layer image))
修正後
  1. (vector-ref (car (gimp-image-get-selected-layers image)) 0)
  
選択中のレイヤ番号(複数)がベクタで返されるように変更されています。 今回の修正では最初の1件のみを利用するように修正しています。

手順(14) API関数への引数の大幅な変更への対応

関数への引数が大幅に変更されているAPI関数に関する修正です。 ファイルへの保存やエクスポート関連のAPIには大幅な変更が加えられています。 筆者が制作したスクリプト内では以下が対象でした。

対象の関数
file-jpeg-save
gimp-file-save
修正前
  1. (file-jpeg-save 1 image activelayer-id jpgfilename jpgfilename (/ quality 100) 0 0 0 "" 0 0 0 1)
修正後
  1. (file-jpeg-export 1 image jpgfilename "" 0.9 0 TRUE TRUE FALSE "sub-sampling-1x1" TRUE 0 "fixed" TRUE FALSE FALSE FALSE TRUE FALSE)
  
詳細は Script-Fu プロシージャブラウザーから確認してください。 Script-Fu プロシージャブラウザーの開き方については以前のこの記事で解説しています。

修正前
  1. (gimp-file-save RUN-NONINTERACTIVE image (car (gimp-image-get-active-layer image)) (car (gimp-image-get-filename image)) (car (gimp-image-get-filename image)))
修正後
  1. (gimp-file-save RUN-NONINTERACTIVE image (car (gimp-image-get-file image)) "")
  
詳細は Script-Fu プロシージャブラウザーから確認してください。 Script-Fu プロシージャブラウザーの開き方については以前のこの記事で解説しています。
  

まとめ

GIMP 3.0系から複数レイヤを同時に選択できるようになりました。 これにより、簡単な操作で複数レイヤを同時に編集することができます。

その影響を受けてGIMP 3.0系ではScript-Fuのバージョンが 2 から 3 に上り、仕様が大幅に変更されました。 Script-Fu バージョン 3では、GIMP 3.0系での複数レイヤの選択に合わせて大幅な仕様変更が行われています。

メニュー