GIMP Script-Fu を使って 所定のディレクトリ内にある xcf ファイルを png にバッチ変換するというエントリーの追伸です。
PNG形式ではなく JPEG形式で出力する必要が生じたのでそれようのコードを書きました。
png として保存(以前書いたもの)
(define (toPNG f)
(let* (
(pngf (string-append
(substring f 0 (- (string-length f) (string-length ".xcf")))
".png"))
(image (car (gimp-file-load RUN-NONINTERACTIVE f f)))
(layer (car (gimp-image-merge-visible-layers image CLIP-TO-IMAGE)))
)
(gimp-file-save RUN-NONINTERACTIVE image layer pngf pngf)
(gimp-image-delete image)
(print pngf)))
toPNG xcfファイル名 することでその xcf ファイルの拡張子を png にして、 そのファイルに PNG 画像を保存する関数です。
PNG ではなく JPEG したい場合、要となるのはこの部分:
(gimp-file-save RUN-NONINTERACTIVE image layer pngf pngf)
GIMPでは save as するときに指定するの拡張子でその画像形式として保存するルール。 当時は PNG として保存したかったので、ファイル名の末尾を .png にしていますが、 今回は JPEG にしたいのでファイル名の末尾を .jpg にします。
それではこの方針で toJPEG 関数を用意します。
(define (toJPEG f)
(let* (
(jpgf (string-append
(substring f 0 (- (string-length f) (string-length ".xcf")))
".jpg"))
(image (car (gimp-file-load RUN-NONINTERACTIVE f f)))
(layer (car (gimp-image-merge-visible-layers image CLIP-TO-IMAGE)))
)
(gimp-file-save RUN-NONINTERACTIVE image layer jpgf jpgf)
(gimp-image-delete image)
(print jpgf)))
ほぼ s/png/jpg/g しただけではある。
(let (
(filelist (cadr (file-glob "xcf/*.xcf" 1)))
)
(for-each (lambda (f) (toJPEG f)) filelist))
カレントディレクトリ以下の xcf/ ディレクトリの中にある xcf ファイルを全部見つけてきて filelist を作成、それを for-each して順に一つのファイルずつ toJPEG 関数に適用しているだけです。
現在のディレクトリ以下はこのような状態になっていることを想定。
.
├── main.scm
└── xcf
├── 1.xcf
└── 2.xcf
main.scm に Script-Fu のコードがあり、これをコマンドラインから実行するには次のようにします。
$ cat main.scm | gimp -n -i -b -
ただ、今回 macOS 上で実行しようとしたら gimp コマンドがないという問題に遭遇。 これは単純に フルパスで gimp コマンドへのパスを指定すればOKです。
このように:
$ cat main.scm | /Applications/GIMP-2.10.app/Contents/MacOS/gimp -n -i -b -
何度も実行するので毎回フルパス指定したくなければ、 たとえば gimp 環境変数を設定して:
$ export gimp=/Applications/GIMP-2.10.app/Contents/MacOS/gimp
その上で次のように実行する:
$ cat main.scm | ${gimp} -n -i -b -
または単純に run.sh などにシェルスクリプトを書いてしまえばよい。
#!/bin/bash
gimp=/Applications/GIMP-2.10.app/Contents/MacOS/gimp
cat main.scm | ${gimp} -n -i -b -
完成した 複数の xcf ファイルを JPEG 画像として保存するスクリプト main.scm:
(define (toJPEG f)
(let* (
(jpgf (string-append
(substring f 0 (- (string-length f) (string-length ".xcf")))
".jpg"))
(image (car (gimp-file-load RUN-NONINTERACTIVE f f)))
(layer (car (gimp-image-merge-visible-layers image CLIP-TO-IMAGE)))
)
(gimp-file-save RUN-NONINTERACTIVE image layer jpgf jpgf)
(gimp-image-delete image)
(print jpgf)))
(let (
(filelist (cadr (file-glob "xcf/*.xcf" 1)))
)
(for-each (lambda (f) (toJPEG f)) filelist))
; (for-each (lambda (f) (toPNG f)) filelist))
(gimp-quit 0)
scheme 流行ればいいのに。