;;
;; 2012/08/08
;;
;; 全レイヤーを画像サイズに合わせるor自動切抜きするスクリプト
;; http://www.geocities.jp/gimproject/scripts/all-layers-resize-autocrop.html
;; を、GIMP 2.8, GIMP 2.6 のどちらでも動くように改造。
;; GIMP 2.8上では、レイヤーグループ内のレイヤーも対象にして処理をする。
;;
;; オリジナル作者 : Tosi 様
;; 勝手に改造したヤツ : mieki256
;;
;; ※ 改造版を公開することについて、
;; 何か問題がありましたら、連絡していただければと…
;; その場合は削除しますので…。
;;
;; 動作確認環境:
;; - Windows7 x64
;; - GIMP 2.8.0 Portable
;; - GIMP 2.6.11
 
;; ----------------------------------------
;; GIMP2.6 か GIMP2.4 なら #t を、そうでなければ #f を返す
(define (script-fu-check-gimp26)
  (let ((version-head (substring (car (gimp-version)) 0 4)))
    (or (string=? version-head "2.6.") (string=? version-head "2.4."))))
 
;; ----------------------------------------
;; 通常レイヤーのみのレイヤーID一覧(list)を取得する
;; 引数は、(vector->list VECTOR) で、listにして渡すこと。
(define (script-fu-get-layers-list ls)
  (if (null? ls)
      ;; 空リストだった場合
      '()
      (let* ((layer (car ls)) ;; 今チェックしてるレイヤー
             (layer-rest (cdr ls))) ;; 残りのレイヤー
        (if (= (car (gimp-item-is-group layer)) 0)
            ;; 通常レイヤーだった場合
            (cons layer (script-fu-get-layers-list layer-rest))
            ;; レイヤーグループだった場合 
            (let*
                (
                 ;; 子レイヤーの一覧を取得
                 (child (cadr (gimp-item-get-children layer)))
                 (child-list (vector->list child)))
              (append
               (script-fu-get-layers-list child-list)
               (script-fu-get-layers-list layer-rest)))))))
 
;; ----------------------------------------
;; 通常レイヤーのみのレイヤーID一覧(vector)を取得する
(define (script-fu-get-layers-array image)
  (if (script-fu-check-gimp26)
      ;; GIMP 2.6用
      (cadr (gimp-image-get-layers image))
      ;; GIMP 2.8以降用
      (let* ((layers (gimp-image-get-layers image))
             (layer-array (cadr layers)) ; レイヤーID一覧(vector)
             (layer-list (vector->list layer-array)) ; レイヤーIDリスト(list)
             )
        (list->vector (script-fu-get-layers-list layer-list)))))
 
;; ----------------------------------------
;; 全レイヤーを画像サイズに合わせる
(define (script-fu-all-layers-resize image drawable)
  (let* ((layer-array (script-fu-get-layers-array image))
         (number-layers (vector-length layer-array))
         (layer-count 0)
         (layer 0))
    (gimp-image-undo-group-start image)
    (set! layer-count 0)
    (while (< layer-count number-layers)
           (set! layer (vector-ref layer-array layer-count))
           (gimp-layer-resize-to-image-size layer)
           (set! layer-count (+ layer-count 1)))
    (gimp-image-undo-group-end image)
    (gimp-displays-flush)))
 
(script-fu-register "script-fu-all-layers-resize"
                    "全レイヤーを画像サイズに合わせる"
                    "すべてのレイヤーを画像サイズに合わせます"
                    "Tosi, mieki256"
                    "Tosi, mieki256"
                    "2007/11, 2012/08"
                    "*"
                    SF-IMAGE     "Image"     0
                    SF-DRAWABLE  "Drawable"  0 )
(script-fu-menu-register "script-fu-all-layers-resize"
                         "<Image>/Layer")
 
;; ---------------------------------------------------------------------------
;; 全レイヤーの自動切り抜き
 
(define (script-fu-all-layers-autocrop image drawable)
  (let* ((active (car (gimp-image-get-active-drawable image)))
         (layer-array (script-fu-get-layers-array image))
         (number-layers (vector-length layer-array))
         (layer-count 0)
         (layer 0))
    (gimp-image-undo-group-start image)
    (set! layer-count 0)
    (while (< layer-count number-layers)
           (set! layer (vector-ref layer-array layer-count))
           (gimp-image-set-active-layer image layer)
           (plug-in-autocrop-layer 1 image layer)
           (set! layer-count (+ layer-count 1)))
    (if (not (= (car (gimp-drawable-is-layer active)) 0))
        (gimp-image-set-active-layer image active))
    (gimp-image-undo-group-end image)
    (gimp-displays-flush)))
 
(script-fu-register "script-fu-all-layers-autocrop"
                    "全レイヤーの自動切抜き"
                    "すべてのレイヤーを自動切抜きして必要最小限のサイズにします"
                    "Tosi, mieki256"
                    "Tosi, mieki256"
                    "2007/11, 2012/08"
                    "*"
                    SF-IMAGE     "Image"     0
                    SF-DRAWABLE  "Drawable"  0 )
(script-fu-menu-register "script-fu-all-layers-autocrop"
                         "<Image>/Layer")
 
最終更新:2012年08月08日 07:34