mieki256's diary



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 3.0.4 Portable samj版で動作確認 :

フィルター → Development → Script-Fu → Script-Fu コンソール、で試していく。

; 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 が出てくることを期待したのだけど…。

> (+ (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 に対応したスクリプトを書く必要性は無いだろう。

参考ページ :


以上です。

過去ログ表示

Prev - 2025/09 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project