GIMPで縁取りするスクリプト

2017-02-20

GIMPで絵の縁取りをするスクリプトを書いてみた。

GIMPではScript-FuとかいうSchemeのスクリプト処理系が使える。 自作のスクリプトを追加したい場合、Macなら~/Library/Application Support/GIMP/2.8/scripts/内に.scmファイルを追加してやればよい。 script-fu-registerで関数を登録して、メニューから呼び出せるようにする。

GIMPのメニュー>フィルター>Script-Fu>Script-Fu コンソールでコンソールウィンドウが開き、インタラクティブに操作できる(けどあまり試してない…)。 「参照」ボタンで呼び出せる関数が調べられる。 開発時、自作のスクリプトを更新したらメニューの「スクリプトを再読込」で更新を反映させる(この手順がメンドイので自動にだかショートカットキー一発にしたい…)。

ですったもんだしながら画像の縁取りをするスクリプトを作った。 選択中のレイヤーの不透明部分に対して、選択色で4近傍の縁取りをする:

(define (script-fu-outline4 img src-layer)
;; Undoのグループ化
(define (undo-group fn)
(gimp-image-undo-group-start img)
(fn)
(gimp-image-undo-group-end img))

;; src-layerの下に空のレイヤーを追加
(define (add-empty-layer)
(let ((index (car (gimp-image-get-layer-position img src-layer)))
(width (car (gimp-drawable-width src-layer)))
(height (car (gimp-drawable-height src-layer))))
(let ((empty-layer (car (gimp-layer-new img width height RGBA-IMAGE
"Outline4" 100 NORMAL))))
(gimp-image-add-layer img empty-layer (+ index 1))
empty-layer)))

;; 不透明部分をずらして塗り潰し
(define (fill layer ofsx ofsy)
(gimp-image-select-item img CHANNEL-OP-REPLACE src-layer)
(gimp-selection-translate img ofsx ofsy)
(gimp-edit-fill layer FOREGROUND-FILL))

(undo-group
(lambda ()
(let ((outline-layer (add-empty-layer))
(outline-color (car (gimp-context-get-foreground))))
(gimp-layer-set-name outline-layer
(string-append "Outline for " (car (gimp-layer-get-name src-layer))))

;; 上下左右にずらして塗りつぶす
(for-each (lambda (offset)
(fill outline-layer (car offset) (cadr offset)))
'((1 0) (-1 0) (0 1) (0 -1)))

;; 中央を抜く
(gimp-image-select-item img CHANNEL-OP-REPLACE src-layer)
(gimp-edit-cut outline-layer)

;; 後始末
(gimp-selection-clear img)
(gimp-image-set-active-layer img src-layer))))

(gimp-displays-flush))

(script-fu-register
"script-fu-outline4" ;func name
"Outline4" ;menu label
"レイヤーの不透明部分を上下左右にずらして枠を作成する" ;description
"tyfkda" ;author
"copyright 2017, tyfkda" ;copyright notice
"Febrary 13, 2017" ;date created
"" ;image type that the script works on
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
)

(script-fu-menu-register "script-fu-outline4" "<Image>/Script-Fu/Outline4")

読み込ませるとメニューにScript-Fu>Outline4>Outline4という項目が追加されるので、選ぶと即実行される。 やってることは単純だけど、まあある程度使えてちゃんと動いたから満足。