Last active
September 12, 2022 11:52
-
-
Save mieki256/b6425ba4e03de27a53387d2eb6d1a4f1 to your computer and use it in GitHub Desktop.
GIMPの全レイヤーを連番リネーム、または連番テキストを描画するScript-Fu。Windows7 x64 + GIMP 2.8.0 Portable、GIMP 2.6.11 で動作確認した。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; | |
;; 全レイヤーに対し、以下のどちらかを行う Script-fu スクリプト | |
;; ・レイヤー名を連番でリネーム | |
;; ・連番テキストを描画 | |
;; | |
;; * レイヤーメニューに追加される | |
;; * 連番文字列を描画する際に使用するフォント種類は、 | |
;; 事前にフォントタブ内などで選択しておく。 | |
;; また、現在の前景色で描画される。 | |
;; | |
;; 余談: | |
;; * レイヤー名の最後に「(100ms)」等を書くと、 | |
;; GIFアニメ作成・再生の際、ウェイト調整ができる。 | |
;; | |
;; 2015/02/14 レイヤー名の頭に連番をつける機能を追加。 | |
;; 2012/08/14 GIMP 2.8に対応。 | |
(script-fu-register | |
"script-fu-all-layers-process-serial-number" | |
"全レイヤーに連番関連処理" | |
"全レイヤーを連番リネーム、または、連番テキストを描画" | |
"mieki256" | |
"Public Domain" | |
"2010-06-21,2012-08-14,2015-02-14" | |
"*" | |
SF-IMAGE "Image" 0 | |
SF-DRAWABLE "Drawable" 0 | |
SF-OPTION "処理内容" '("連番リネーム" "連番を描画") | |
SF-ADJUSTMENT "桁数" '(4 1 10 1 5 0 1) | |
SF-ADJUSTMENT "開始番号" '(0 0 9999999 1 5 0 1) | |
SF-TOGGLE "逆順" FALSE | |
SF-TOGGLE "レイヤー名保持" FALSE | |
SF-STRING "付加文字列(前)" "" | |
SF-STRING "付加文字列(後)" "" | |
SF-ADJUSTMENT "描画位置 X" '(0 0 9999 1 10 0 1) | |
SF-ADJUSTMENT "描画位置 Y" '(0 0 9999 1 10 0 1) | |
SF-ADJUSTMENT "フォントサイズ(pixel)" '(24 1 9999 1 10 0 1) | |
) | |
(script-fu-menu-register | |
"script-fu-all-layers-process-serial-number" | |
"<Image>/Layer") | |
(define (script-fu-all-layers-process-serial-number | |
image | |
drawable | |
job ; 処理種類 | |
digits ; 桁数 | |
start ; 開始番号 | |
revfg ; 逆順フラグ | |
leavename ; レイヤー名保持 | |
prefix ; 前に付加する文字列 | |
suffix ; 後に付加する文字列 | |
x ; 描画位置 x | |
y ; 描画位置 y | |
size ; フォントサイズ | |
) | |
;; ---------------------------------------- | |
;; 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))))) | |
;; ---------------------------------------- | |
;; 桁数分を「0」で埋めた文字列を作成して返す関数 | |
(define (gen-numstr prefix start count digits suffix) | |
(let* ((zeros (make-string 10 #\0)) ; "000..."を作成 | |
(str (number->string (+ start count))) | |
(num (string-append zeros str)) | |
(pos (- (string-length num) (max digits (string-length str))))) | |
(string-append prefix (substring num pos) suffix))) | |
;; ---------------------------------------- | |
;; メイン処理 | |
(let* ((layer-array | |
(vector->list | |
(script-fu-get-layers-array image))) ; レイヤーlist取得 | |
(layers-len (length layer-array)) ;; レイヤー枚数取得 | |
(font (car (gimp-context-get-font))) ;; フォント種類取得 | |
(num 0) | |
(stepvalue 0)) | |
;; カウンタ開始番号とステップ値を設定 | |
(set! num (if (= revfg FALSE) (- layers-len 1) 0)) | |
(set! stepvalue (if (= revfg FALSE) -1 1)) | |
(gimp-image-undo-group-start image) ; Undo Start | |
;; レイヤー枚数分ループ処理 | |
(let loop ((lis1 layer-array)) | |
(if (null? lis1) | |
#t | |
(let ((layer (car lis1)) | |
(str (gen-numstr prefix start num digits suffix))) | |
(if (= job 0) | |
;; レイヤー名変更 | |
(if (= leavename FALSE) | |
(gimp-layer-set-name layer str) ;; 連番で置き換え | |
(let* ((layername (car (gimp-layer-get-name layer))) | |
(nstr (string-append str "_" layername))) | |
(gimp-layer-set-name layer nstr) ;; レイヤー名を保持しながら連番追加 | |
)) | |
;; 文字描画 | |
(let ((txt 0)) | |
;; 指定レイヤーをアクティブに | |
(gimp-image-set-active-layer image layer) | |
;; 文字描画 | |
(set! txt (car (gimp-text-fontname image layer x y str 0 TRUE size PIXELS font))) | |
;; 選択領域を固定 | |
(gimp-floating-sel-anchor txt))) | |
(set! num (+ num stepvalue)) ; カウンタ増減 | |
;; 再帰でループ | |
(loop (cdr lis1))))) | |
(gimp-image-undo-group-end image) ; Undo End | |
(gimp-displays-flush) ; 再描画 | |
)) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Screenshots.