2025/09/26(金) [n年前の日記]
#1 [gimp] Script-FuでGIMPのバージョンを取得する
Script-FuでGIMPのバージョンを調べて、処理を分ける記述をしてみたい。
GIMP 2.x (Script-Fu v2) と GIMP 3.x (Script-Fu v3) で、Script-Fu から呼び出せる関数名や変数名が結構変わったらしいので、バージョンによって処理を分けることができれば1つのスクリプトソースでどちらにも対応できるかなと。
ちなみに、GIMP 2.8以上か、2.8未満かを判別する処理は以前書いていた。
_mieki256's diary - Script-FuでGIMPのバージョンを調べる
ただ、"x.yy.zz" の "yy"だけを取り出して判別しているので、3.x には全然対応できていない。
もし、2.6、2.8、2.10、3.0 といった数値で返ってくると分岐が楽になりそうだなと…。(後になってこの考え自体が間違ってることに気づいた…。)
GIMP 2.x (Script-Fu v2) と GIMP 3.x (Script-Fu v3) で、Script-Fu から呼び出せる関数名や変数名が結構変わったらしいので、バージョンによって処理を分けることができれば1つのスクリプトソースでどちらにも対応できるかなと。
ちなみに、GIMP 2.8以上か、2.8未満かを判別する処理は以前書いていた。
_mieki256's diary - Script-FuでGIMPのバージョンを調べる
ただ、"x.yy.zz" の "yy"だけを取り出して判別しているので、3.x には全然対応できていない。
もし、2.6、2.8、2.10、3.0 といった数値で返ってくると分岐が楽になりそうだなと…。(後になってこの考え自体が間違ってることに気づいた…。)
◎ GIMP 3.0.4 Portable samj版で動作確認 :
フィルター → Development → Script-Fu → Script-Fu コンソール、で試していく。
ここまでは以前と同じように動いたけれど、配列の中からインデックス値を指定して要素を取り出せる nth を使おうとしたら問題発生。
GIMP 3.0 では nth が無くなってしまったのか…。どうしてそんなところを削ったのか…。
仕方ないので car と cdr を使って頑張る。
これで、GIMPのメジャーバージョンとマイナーバージョンをそれぞれ取り出して数値化することはできた。
; GIMPのバージョンは gimp-version で取得できる。配列/リストが返ってきて、その中に文字列が含まれている。
> (gimp-version)
("3.0.4")
; car で配列の一番最初の要素を取り出せる。
; これでバージョン情報を文字列の形で取り出せる。
> (car (gimp-version))
"3.0.4"
; Script-Fu の場合、strbreakup を使えば文字列を特定文字で分割した配列を得られる。
; "." で分割してみる。
> (strbreakup (car (gimp-version)) ".")
("3" "0" "4")
ここまでは以前と同じように動いたけれど、配列の中からインデックス値を指定して要素を取り出せる nth を使おうとしたら問題発生。
; 配列の中からインデックス値を指定して要素を取り出す nth を使いたいのだけど…。 ; GIMP 2.10 (Script-Fu v2) では nth を使って配列から要素を取り出せたけど、 ; GIMP 3.0 (Script-Fu v3) では「そんな関数はないよ」と言われてしまう…。 > nth Error: eval: unbound variable: nth
GIMP 3.0 では nth が無くなってしまったのか…。どうしてそんなところを削ったのか…。
仕方ないので car と cdr を使って頑張る。
; nth の代わりに car と cdr を使って取り出す。 > (car (strbreakup (car (gimp-version)) ".")) "3" > (car (cdr (strbreakup (car (gimp-version)) "."))) "0" > (car (cdr (cdr (strbreakup (car (gimp-version)) ".")))) "4" ; string->number を使って文字列を数値に変換する ; これは GIMP 3.0 (Script-Fu v3) でも使えるらしい。 > string->number #<CLOSURE> > (string->number (car (strbreakup (car (gimp-version)) "."))) 3 > (string->number (car (cdr (strbreakup (car (gimp-version)) ".")))) 0
これで、GIMPのメジャーバージョンとマイナーバージョンをそれぞれ取り出して数値化することはできた。
; 2番目の桁に 0.1 を掛けて、1番目の桁と加算すれば、3.0 という数値を得られる。 > (define gimp-major-version (string->number (car (strbreakup (car (gimp-version)) ".")))) gimp-major-version > gimp-major-version 3 > (define gimp-minor-version (string->number (car (cdr (strbreakup (car (gimp-version)) "."))))) > gimp-minor-version 0 > (+ gimp-major-version (* 0.1 gimp-minor-version)) 3.0 ; 1行に無理矢理まとめると以下。 > (+ (string->number (car (strbreakup (car (gimp-version)) "."))) (* 0.1 (string->number (car (cdr (strbreakup (car (gimp-version)) ".")))))) 3.0
◎ GIMP 2.10.38 Portable で動作確認 :
GIMP 2.10.38 Portable で試してみた。しかし、GIMP 3.0.4 で上手く行った1行を入れてみたら、変な値が出てきた。2.10 が出てくることを期待したのだけど…。
ここでふと気が付いた。2.10.38 の "10" に 0.1 を掛けたら 1 になるから、2 + 1 = 3.0 になっちゃうよな…。これが正常な動作だ…。
考えてみたら、数値として 2.6, 2.8, 3.0 は取り出せるけど、2.10 は取り出せないのでは? それ、2.1 になってしまうだろう…。なんてこった。自分は馬鹿だなあ…。
GIMPのメジャーバージョンとマイナーバージョンを取り出して、数値にして大小を比較するのは無理だなと気づいた。せいぜい、メジャーバージョンだけを取り出して数値にして比較するのが関の山だろう…。
> (+ (string->number (car (strbreakup (car (gimp-version)) "."))) (* 0.1 (string->number (car (cdr (strbreakup (car (gimp-version)) ".")))))) 3.0
ここでふと気が付いた。2.10.38 の "10" に 0.1 を掛けたら 1 になるから、2 + 1 = 3.0 になっちゃうよな…。これが正常な動作だ…。
考えてみたら、数値として 2.6, 2.8, 3.0 は取り出せるけど、2.10 は取り出せないのでは? それ、2.1 になってしまうだろう…。なんてこった。自分は馬鹿だなあ…。
GIMPのメジャーバージョンとマイナーバージョンを取り出して、数値にして大小を比較するのは無理だなと気づいた。せいぜい、メジャーバージョンだけを取り出して数値にして比較するのが関の山だろう…。
;メジャーバージョンだけを数値化 > (string->number (car (strbreakup (car (gimp-version)) "."))) 2 ; メジャーバージョンが 2 以下なのかを比較 > (>= 2 (string->number (car (strbreakup (car (gimp-version)) ".")))) #t ; メジャーバージョンが 3 以上なのかを比較 > (<= 3 (string->number (car (strbreakup (car (gimp-version)) ".")))) #f
◎ バージョンを比較して処理することを諦めた :
GIMPのバージョンでScript-Fuの処理を分けるのは面倒臭い気がしてきた。2.6, 2.8, 3.0 なら分けられるけど、2.10 の扱いで困ってしまう。「このスクリプトソースは特定バージョンのGIMP上でしか動きません。あしからず」と決めてしまってスクリプトを改変してしまうほうがまだ楽だろうなあ…。
そもそも今から、GIMP 2.8, 2.10, 3.0 のどれでも動くScript-Fuを書く場面が一体どれだけあるだろうか…。現行版の 3.0 に合わせて書いたらそれで終わりで、2.10より以前のバージョンで動くように改変しなきゃいけない場面はまず無い気がする。
GIMP 2.6以前はグループレイヤーが無くて、GIMP 2.8以降はグループレイヤーがあるので、そのあたりに対応させるのも面倒臭い…。いや、今から GIMP 2.4 や 2.6 に対応したスクリプトを書く必要性は無いだろう。
そもそも今から、GIMP 2.8, 2.10, 3.0 のどれでも動くScript-Fuを書く場面が一体どれだけあるだろうか…。現行版の 3.0 に合わせて書いたらそれで終わりで、2.10より以前のバージョンで動くように改変しなきゃいけない場面はまず無い気がする。
GIMP 2.6以前はグループレイヤーが無くて、GIMP 2.8以降はグループレイヤーがあるので、そのあたりに対応させるのも面倒臭い…。いや、今から GIMP 2.4 や 2.6 に対応したスクリプトを書く必要性は無いだろう。
◎ 参考ページ :
[ ツッコむ ]
#2 [gimp] GIMP 3.0のレイヤー貼り付けについて
無料で利用できる画像編集ソフト GIMP 3.0.4 Portable を触っていたら貼り付けの動作が以前のバージョンとは変わっていたことに気づいた。一般的な画像編集ソフト同様に、貼り付けをするとレイヤーが新規作成される仕様に変更されていた。ありがたい。これでスクリプトを一つ減らせる…。
少し解説。
GIMPは昔から開発されているソフトなので、貼り付けの動作が一般的な画像編集ソフトと違っていた。一般的な画像編集ソフトは、貼り付けをするとレイヤーが新規作成されて、そこにクリップボードの内容が描き込まれるけれど…。
GIMP 2.10 までは、貼り付けをすると「フローティング選択範囲」という一時的なレイヤーが作られる。位置を変えたりしてから確定すると、「フローティング選択範囲」は元々のレイヤーに合成されてしまう。
自分はその仕様が嫌だったので、paste-layer.scm というスクリプトをわざわざ導入して、Ctrl + V をそのスクリプト(script-fu-paste-layer)に割り当てて使っていた。
_貼り付け スクリプト (WebArchive, 2019/03/31)
GIMP 3.0 からは、そういうことをしないで済む。ありがたや。
少し解説。
GIMPは昔から開発されているソフトなので、貼り付けの動作が一般的な画像編集ソフトと違っていた。一般的な画像編集ソフトは、貼り付けをするとレイヤーが新規作成されて、そこにクリップボードの内容が描き込まれるけれど…。
GIMP 2.10 までは、貼り付けをすると「フローティング選択範囲」という一時的なレイヤーが作られる。位置を変えたりしてから確定すると、「フローティング選択範囲」は元々のレイヤーに合成されてしまう。
自分はその仕様が嫌だったので、paste-layer.scm というスクリプトをわざわざ導入して、Ctrl + V をそのスクリプト(script-fu-paste-layer)に割り当てて使っていた。
_貼り付け スクリプト (WebArchive, 2019/03/31)
GIMP 3.0 からは、そういうことをしないで済む。ありがたや。
◎ 2025/09/27追記 :
GIMP 2.10.38 Portable を触っていたら、編集 → クリップボードから生成、という項目があることに気づいた。その中に、「レイヤー」「レイヤー (同じ位置)」等の項目がある…。選んでみたらクリップボードの内容が新規レイヤーとして作成された。
なんてこった。知らなかった。どのバージョンからそうなっていたのか分からないけれど、レイヤーとして貼り付けをする機能は以前から実装されていたのだな…。メニューの中に隠れていただけだったとは…。
わざわざスクリプトを導入する必要はなかった。ショートカットキーの割り当てを変更するだけで済む話だった。トホホ。
気になって GIMP 2.6.12 Portable を起動して確認してみたら、GIMP 2.6 の時点ですら「クリップボードから生成」という項目があった。ただし、切り取り/コピー元と同じ位置にレイヤー貼り付けはできない模様。画像の左上に位置する感じでレイヤー貼り付けがされてしまう。
何にせよ、そんな前から機能があったと今頃知って結構ショック。
なんてこった。知らなかった。どのバージョンからそうなっていたのか分からないけれど、レイヤーとして貼り付けをする機能は以前から実装されていたのだな…。メニューの中に隠れていただけだったとは…。
わざわざスクリプトを導入する必要はなかった。ショートカットキーの割り当てを変更するだけで済む話だった。トホホ。
気になって GIMP 2.6.12 Portable を起動して確認してみたら、GIMP 2.6 の時点ですら「クリップボードから生成」という項目があった。ただし、切り取り/コピー元と同じ位置にレイヤー貼り付けはできない模様。画像の左上に位置する感じでレイヤー貼り付けがされてしまう。
何にせよ、そんな前から機能があったと今頃知って結構ショック。
[ ツッコむ ]
以上、1 日分です。