有馬総一郎のブログ

(彼氏の事情)

2015年01月31日 17:16:00 JST - 3 minute read - GIMP

GIMPのscript-fuを使ってpng画像ファイルを一括でjpg画像ファイルに変換する

png画像ファイルがあることがわかったので、それを一括でjpg画像ファイルに変換したい。GIMPのバッチファイル script-fuをPowershellでグルグルキックしてやろうと思ったのだけど、バッチモードで起動してもコマンドプロンプトが立ち上がって、自動的に閉じることが出来ない。

初めそれでもいいやとばかりにやってみたら、GIMPがウィルス感染したかのように立ち上がって(そりゃそうだ)、メモリーエラーになってしまった。結局、 script-fuの中でグルグル回したほうがいいのだろうけど、良いサンプルが見つからなかったので、リテラルでパスをグルグル回す script-fuを書いて誤魔化すこととした。

script-fuでは\は\\とエスケープしないと正しく読み取ってくれない。まずはパスだけを羅列し、pngからjpgに変換する script-fuを呼ぶscriptと、入出力の画像ファイルパスを受け取り変換だけを行う script-fuの2つを用意した。

script-conv-all.scm

(define (script-conv-all)
  (script-conv-jpeg "C:\\User\arimasou16\Music\\1349\\Liberation\\folder.png" "C:\\User\arimasou16\Music\\1349\\Liberation\\folder.jpg")
  (script-conv-jpeg "C:\\User\arimasou16\Music\\Björk\\Vespertine\\folder.png" "C:\\User\arimasou16\Music\\Björk\\Vespertine\\folder.jpg")
   …中略…
  (script-conv-jpeg "C:\\User\arimasou16\Music\\서문탁\\Asura\\folder.png" "C:\\User\arimasou16\Music\\서문탁\\Asura\\folder.jpg")
  (script-conv-jpeg "C:\\User\arimasou16\Music\\소녀시대\\THE BEST\\folder.png" "C:\\User\arimasou16\Music\\서문탁\\Asura\\folder.jpg")
)
(script-fu-register "script-conv-all"
                    "/Xtns/Script-Fu/script-conv-all"
                    "Converts all jpg files"
                    "arimasou16"
                    "arimasou16"
                    "2015"
                    ""
                    )

script-conv-jpeg.scm

(define (script-conv-jpeg infile outfile)
  (let* (
         (img (car (gimp-file-load 1 infile infile)))
         (layer (car (gimp-image-active-drawable img)))
        )
  (file-jpeg-save 1 img layer outfile outfile 1.00 0.00 1 0 "" 0 1 0 0)
  )
)

Powershellで script-fuを呼び出す。Powershellではダブルコーテーションの中のダブルコーテーションは`でエスケープする。

PS C:\Users\arimasou16> $GimpParams = @("-i", "-b", "`"(script-conv-all 1`")`"", "`"(gimp-quit 0)`"")
PS C:\Users\arimasou16>
PS C:\Users\arimasou16> Start-Process -FilePath "C:\Program Files\GIMP 2\bin\gimp-2.8.exe" -ArgumentList $GimpParams -wait
PS C:\Users\arimasou16>

成功した。

script-fu成功
単発ごとに↑これが立ち上がるのが邪魔なんだよな…Powershellからのキックの仕方が良くないのかな…