新しい記事を書く事で広告が消せます。
>> 古い記事: JavaScript: 子要素に入ったときに mouseout 用の処理をさせないようにする
<< 新しい記事: Script-Fu: すべてのレイヤーに対する処理(よく使うもの)を簡単に呼び出せるようにした
Script-Fu: 「すべてのレイヤーに対して処理○○を行う」のテンプレートとスクリプト作成メモ
割と使いどころが多そうなのでテンプレート的に用意しておきたいというのと、 せっかくなので手順を簡単にメモりました。
例として、それぞれのレイヤーに対して 「階調を反転」を適用するスクリプトを書いてみます。
ポイントはこんなところ:
-
各レイヤーは整数で識別される(これは Script-Fu の基本)。
以下、便宜的に「レイヤー番号」と呼ぶ。
参考: イメージやアクティブなレイヤー/チャンネル の PDB ID をタイトルバーやステータスバーに表示する - まず「レイヤー番号のリスト」を取得する
- for-each で各レイヤーに対して (レイヤー番号を使って) 処理Xを行う。
作業用メモ
まずは 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アニメの逆まわしなんかもこれでできます)。
わざわざ ~.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))))))
関連記事
- 2010-07-24
- | tag: Gimp Script-Fu
- | trackback: 0
- | comment: 0
-
|
>> 古い記事: JavaScript: 子要素に入ったときに mouseout 用の処理をさせないようにする
<< 新しい記事: Script-Fu: すべてのレイヤーに対する処理(よく使うもの)を簡単に呼び出せるようにした
** ホームに戻る