2019年11月18日月曜日

GIMP Script-Py (8) パラサイトを使おう

これから書く事は、間違っているかも知れません。
これ迄、全く、使って来なかった機能です。
それは パラサイト と呼ばれる機能です。
パラサイトって ... 何?。  Script-Py / Scropt-Fu 共通項目。


冒頭に、断って置きます。
分類上、GIMP Script-Py にしましたが、
Script-Fu でも、全く、同じ様に、扱えますので、 その方面の方は、参考にして下さい。
サンプルのコードの記述等は Python と Tiny-Scheme との違いがありますので、ご注意を!。.


通常、スクリプトを書く場合、
ひとつで完結する様に書きますね。
其処で用意した変数類はスクリプトから抜け出して仕舞えば、消えてなくなります。
複数を数珠繋ぎの様に扱う場合にも、
ひとつの中から呼び出すなら、パラメータを、皆、指定して呼び出す場合が殆どでしょう。
複数で大きな一つの機能を実現する場合にも、
個々のものは独立していて、値を渡せる訳ではありません。  普通は。
そして、多くのケースでは、この様な 値渡し は考えませんね。
それも、 パラメータの一部だけ渡して起動させ、
残りのパラメータは、ユーザーに入力や選択を任せる、等と言うケースは稀でしょう。

でも、出来ます!。

それを支えているのが、
パラサイト や 名前付きバッファ の様です。

パラサイトは 文字列。  配列にする事は不可。
名前付きバッファは 画像。

テキストや画像はクリップボードでもお馴染み。
でも、これは OS が提供する機能です。

ファイル渡し も 有名ですね。
これは、多くの場合、他のソフトやアプリとの通信で用いられます。

上のふたつ パラサイト や 名前付きバッファ は GIMP そのものに用意された機能になります。
内部にそれらの値を保持する目的で使われています。
勿論、読み出しも可能です。


今回、お話しするのは パラサイト です。

寄生虫 と訳される この言葉。
寄生虫の様に、 くっついて動き廻れる 事からの命名でしょうか?。
GIMP 内部 に持つ、テキスト用のクリップボードの類 と考えれば、分かり易いでしょうか。

これは、主に、プログラミング(スクリプト等)で使われます。
スクリプト内部で定義した変数は、
スクリプト終了と共に、消去されますが、
パラサイトに書き込んだものは、 その GIMP セッション の間、有効になります。
これを グローバル と呼びます。
画像やレイヤー等に 固有 のものもあります。
書き込み方に依っては、終了時に設定が外部ファイル保存され、次回のセッションでも有効化出来ます。
同様に、画像ファイルに添付させる指示をすれば、そのファイルを開けば、有効になります。
そして、それを閉じれば、無効化されます。
読み出す側は、何時でも、その値が取得出来る仕組みです。

そして、これらのパラサイトには、幾つでも、設定が可能です。

良い例が、
新規画像生成時の コメント 欄 です。
これは、ヘルプを読めば、パラサイトを使っている と明記されていますね。

また、.jpg の EXIF 情報に基づく 画像回転 にも利用されています。

この機能を上手に使う事で、
複数のスクリプトで、柔軟な処理 を構築可能になります。


但し、
普通のスクリプトでこれを目にする機会は ... 殆どありません。
まぁ、高度な機能を実現する目的で使われるのが多いのでしょうから、
普通のスクリプト書き には 無用の長物 かも知れませんが、 ね。

理屈的には分かるのですが、
具体的に利用するケースは ... あまり想像出来ません、私の場合。 ;)


参考に、コンソールで試したものを。
  この例では、セッション限りでは無く永続化されます。 最後に取り消していますが。.

GIMP 2.10.14 Python Console
Python 2.7.17 (default, Oct 23 2019, 05:20:31)  [GCC 9.2.0 64 bit (AMD64)]]
>>>
>>> ps_name = "my_parasite"
>>> ps_string = "variable_in_this_session"
>>> parasite = gimp.Parasite(ps_name, 1, ps_string)
>>> parasite
<parasite my_parasite>
>>> str(parasite)
'variable_in_this_session'
>>>
>>>
>>> parasite_now = gimp.parasite_find(ps_name)
>>>
>>> parasite_now
>>>
>>> str(parasite_now)
'None'
>>>
>>> gimp.parasite_attach(parasite)
>>>
>>> parasite_now = gimp.parasite_find(ps_name)
>>>
>>> parasite_now
<parasite my_parasite>
>>> str(parasite_now)
'variable_in_this_session'
>>>
>>>
>>> pdb.gimp_detach_parasite(ps_name)
>>>
>>> parasite_now = gimp.parasite_find(ps_name)
>>> parasite_now
>>>
>>> str(parasite_now)
'None'
>>>

まぁ、普通はこれを見ても ピンッ とは来ないと思います。
大丈夫です。  それが、普通です。  ;)



0 件のコメント:

コメントを投稿