;; ;; 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" "/Layer/All Layers") ;; --------------------------------------------------------------------------- ;; 全レイヤーの自動切り抜き (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" "/Layer/All Layers")