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という項目が追加されるので、選ぶと即実行される。 やってることは単純だけど、まあある程度使えてちゃんと動いたから満足。