通常の 画像からレイヤーを取得すると、 グループに格納されたレイヤー群は隠蔽されて見えないから、でしょうね。
でも、レイヤーグループは便利です。
是非、 Script-Fu を書く上でも、積極的に使いたい機能 なのではないでしょうか。
レイヤー群をひとまとめにして扱う レイヤーグループの機能 が GIMP 2.8 になって採用されました。
冒頭に書いた様に、 レイヤーを扱う上で、 グループに格納されたレイヤー群は隠蔽されて見えない点が 興味の中心に見えます。
実際に、 Script-Fu でレイヤーグループを新たに作る例は、あまり、見付かりません。 検索が下手だからか ... ?。.
無いなら 作っちゃえ! の精神で ... 。
先ず、4枚のレイヤーからなる 画像 を用意しましょうか。
このうち、上に載る3枚を 新たに設けた レイヤーグループに収めるものとします。
これを、 GIMP 2.8 のメニュー項目から操作する方法は、 ここでは、説明を省きます。 ご存知と仮定します。.
では、 コンソール を使って見て行きましょう!。
現実的に、Script-Fu を書くには、この流れを 変数 に置き換える作業が必要です。
コンソールで実行して得られる数値を 変数として 取り込まなければならないからですね。
でも、ここでは、触れない事にします。
画像 ID が 6 、各レイヤーの ID が夫々 下から 12 13 14 15 となっているものとします。 上図で背景が ID 12。.
新たにレイヤーグループを作るのは (gimp-layer-group-new image) ですね。
最上層に作るので add の引数は -1 です。
レイヤー ID を数値で取得したいので 次の様にします。
> (define img 6)
img
> (car (gimp-layer-group-new img))
16
> (gimp-image-add-layer img 16 -1)
(#t)
このままでは、モニターにはレイヤーグループは追加されません。
表示したければ、これ ですね。
> (gimp-displays-flush)
(#t)
次に、 既存のレイヤーをグループ内に格納します。
(gimp-image-reorder-item image item parent position) です。
item が対象レイヤーの ID で、 parent が収めるグループのレイヤー ID です。
position で位置指定出来ますが、最上層に加えるなら ここでも -1 です。
> (gimp-image-reorder-item img 13 16 -1)レイヤーそのものは、 フラットな形でも グループに格納しても、 レイヤー番号は変わりません。 *1.
(#t)
> (gimp-image-reorder-item img 14 16 -1)
(#t)
> (gimp-image-reorder-item img 15 16 -1)
(#t)
最初に画像に加えられた時の ID を そのまま 保持しています。 *1.
Script-Fu 上で グループに格納したレイヤーは、事前にその番号が分かっているなら、いきなり その番号でアクセス出来ます。 *1.
一々、取得し直す必要は無い 訳ですね。 *1.
因みに、各レイヤー情報を取得して見ましょう。 よくある 取得 の例ですね。 *1.
> (gimp-image-get-layers img)
(2 #(16 12))
> (gimp-image-get-item-position img 16)
(0)
> (gimp-image-get-item-position img 15)
(0)
> (gimp-image-get-item-position img 13)
(2)
> (gimp-image-get-item-position img 12)
(1)
> (gimp-item-get-children 16)
(3 #(15 14 13))
> (gimp-item-is-group 16)
(1) ; Notice: 1=TRUE 0=FALSE
> (gimp-item-get-children 12)
Error: (<unknown> : 45562772) Procedure execution of gimp-item-get-children failed
まぁ、実際に、Script-Fu で、レイヤーグループを作るには、レイヤーそのものを 追加編集するでしょうから、
その部分の知識が更に必要となりますが、
その辺りは、既存のサイトやページが沢山ありますので、 ここでそれを書くのは止めます。
レイヤーグループの生成は、
ここで示した流れを Script-Fu の関数として定義すれば良い事になります。
最初からグループ内にレイヤーを生成してから操作する方法もあると思いますが、
先に、フラットな形でレイヤー操作してしまい、 後からグループに収める方が、分かり易い気がしています。
勿論、最初に入れ物のグループレイヤーを生成して、フラットなレイヤーを追加操作し、最後に収めるのでも OK ですね。。 .
[2016/03/16] 誤字訂正
[2016/03/16] 追補 *1.
0 件のコメント:
コメントを投稿