>> 古い記事: JavaScript: 子要素に入ったときに mouseout 用の処理をさせないようにする
<< 新しい記事: Script-Fu: すべてのレイヤーに対する処理(よく使うもの)を簡単に呼び出せるようにした

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Script-Fu: 「すべてのレイヤーに対して処理○○を行う」のテンプレートとスクリプト作成メモ

割と使いどころが多そうなのでテンプレート的に用意しておきたいというのと、 せっかくなので手順を簡単にメモりました。

例として、それぞれのレイヤーに対して 「階調を反転」を適用するスクリプトを書いてみます。


ポイントはこんなところ:

作業用メモ

まずは Script-Fuコンソール や script-fu-shell.rb などを使って関数の挙動などをチェックしていきます。

;; 「レイヤー番号のリスト」の取得には gimp-image-get-layers が使えそう
> (define img 3) ;; 作業用なので適宜 defnie で束縛(代入)しちゃって良いと思います
img
> (gimp-image-get-layers img)
(3 #( 30 29 27 ))
> (cadr (gimp-image-get-layers img))
#( 30 29 27 ) ;=> 上のレイヤーが先
> (vector? (cadr (gimp-image-get-layers img)))
#t

;; ベクトルには for-each が使えないようなのでリストに変換
> (vector->list (cadr (gimp-image-get-layers img)))
(30 29 27)

;; 変数 layer-id-list に束縛
> (define layer-id-list (vector->list (cadr (gimp-image-get-layers img))))
layer-id-list

> (for-each (lambda (drw) (gimp-message (number->string drw))) layer-id-list)
((#t) (#t)) ;=> 上のレイヤーから順に、エラーコンソールにレイヤー番号が表示される

;; 上のレイヤーから順番にレイヤー番号を参照できていることが確認できたので
;; それぞれに対して階調の反転を適用してみる
> (for-each (lambda (drw) (gimp-invert drw)) layer-id-list)
((#t) (#t)) ;=> すべてのレイヤーに対して階調の反転が適用できた

for-each の部分は Ruby 風に書くとこんな感じですね:
layer_id_list.each{|drw| gimp_invert(drw) }

まとめて書き直す

だいたいこんな風にやればできるな、ということが分かったので 関数の形にまとめてみます。


;; layer-id-list もなくせるが、読みやすさのため残してみた
(define (invert-all-layers img)
  (let ((layer-id-list (vector->list (cadr (gimp-image-get-layers img)))))
    (for-each
     (lambda (drw) (gimp-invert drw))
     layer-id-list)))

(invert-all-layers 3) などと呼び出して、ちゃんと動くか確認。

仕上げ

あとは Script-Fu のテンプレートにはめ込んでやれば完成です。


(define (script-fu-invert-all-layers img)
  (let ((layer-id-list (vector->list (cadr (gimp-image-get-layers img)))))
    (gimp-image-undo-group-start img)   ; アンドゥしたらここに戻る
    (for-each
     (lambda (drw) (gimp-invert drw))
     layer-id-list)
    (gimp-image-undo-group-end img)     ; ここまでがアンドゥの対象
    (gimp-displays-flush)))

(script-fu-register
 "script-fu-invert-all-layers"
 "<Image>/Script-Fu/misc/すべてのレイヤーに「階調の反転」" ; このスクリプトのメニュー位置
 "すべてのレイヤーに「階調の反転」"        ; このスクリプトの説明
 "sonota"            ; 作者名
 "(c) 2010"          ; コピーライト
 "2010-07-24"        ; 日付
 "RGB*, GRAY*"       ; スクリプトが動作可能なモード
 SF-IMAGE "Image" 0  ; 引数1
 )

というわけで、あとは (gimp-invert drw) の部分を書き換えれば、 各レイヤーに対してあんなことやこんなことができるようになります :)

たとえば
(gimp-image-raise-layer-to-top img drw)
とするとレイヤーを逆順に並べ換えることができます (GIFアニメの逆まわしなんかもこれでできます)。

20100725 追記: これに関してはメニューの [ レイヤー>重なり>レイヤー順序の反転 ] でできることが分かりました。

わざわざ ~.scm にしてメニューから呼び出さなくても、 次のコードをエディタでいじりつつ Script-Fuコンソールに貼って使う というのも良いと思います。


;; IMG_ID と foo-proc を適宜書き換えるなどして使う
(define img IMG_ID)
(for-each
 (lambda (drw) (foo-proc drw))
 (vector->list (cadr (gimp-image-get-layers img))))))

関連記事


Gimpに関する記事のもくじ

>> 古い記事: JavaScript: 子要素に入ったときに mouseout 用の処理をさせないようにする
<< 新しい記事: Script-Fu: すべてのレイヤーに対する処理(よく使うもの)を簡単に呼び出せるようにした
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。