GIMPでバッチ処理を行う

ドーモ
ユーザーさん

German=Ninjaデス

SVGファイルをEPSファイルに変換したい。
そういう事情があった。

オープンソースでこれができるのは、InkscapeとGIMPだろう。
Inkscapeは、しかし、svgファイルの素材の透明部分がうまく処理できない。

具体的には以下の内容のSVGファイルを考える。
いらすとや様とパワーポイントで適当に作ってSVG出力したようなアレだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/d3c1eda1-5746-97ce-75e1-3cfb6be975f4.png)


これをInkscapeでepsとして出力すると、
こんな感じになってしまう。どうしてどうして。
悲しい悲しい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/de3334f7-89ad-88f0-46a3-8b182cf416a6.png)


GIMPであれば問題なくこんな感じに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676634/4891025a-4ea3-8e66-6ab5-c659fc3aaba3.png)

Inkscapeは自分でepsとしたファイルを開こうとすると失敗するのも辛い。
というわけでGIMPを使うことにしたのだ。

で、結構クリック要求が激しいので、これはもう自動化したい。
GIMPにもInkscapeもCLIが存在するようで、
GIMPの場合はScript-fuとかいうようだ。

憧れのLISPの方言のようで、これを機会に手を付けてみる。
色々調べて、以下のコードを作った
string-replaceの部分はStack overflowから直輸入している。
ありがとうございます。

```this_script.scm
(define (string-replace strIn strReplace strReplaceWith)
    (let*
        (
            (curIndex 0)
            (replaceLen (string-length strReplace))
            (replaceWithLen (string-length strReplaceWith))
            (inLen (string-length strIn))
            (result strIn)
        )
        ;loop through the main string searching for the substring
        (while (<= (+ curIndex replaceLen) inLen)
            ;check to see if the substring is a match
            (if (substring-equal? strReplace result curIndex (+ curIndex replaceLen))
                (begin
                    ;create the result string
                    (set! result (string-append (substring result 0 curIndex) strReplaceWith (substring result (+ curIndex replaceLen) inLen)))
                    ;now set the current index to the end of the replacement. it will get incremented below so take 1 away so we don't miss anything
                    (set! curIndex (-(+ curIndex replaceWithLen) 1))
                    ;set new length for inLen so we can accurately grab what we need
                    (set! inLen (string-length result))
                )
            )
            (set! curIndex (+ curIndex 1))
        )
       (string-append result "")
    )
)


(define (myscript infile)(
    let* 
        (   
            (infile infile)
            (outfile "")
            ; 
            
            (outnumber 9)
            (img (car (file-svg-load 1 infile infile 0 0 0 0)))
            (imf (car (gimp-image-flatten img)))
            (drw (car (gimp-image-active-drawable img)))
        )
        (set! outfile (string-replace infile "svg" "eps"))
        (gimp-message outfile)
	    (file-eps-save 1 img drw outfile outfile 0 0 0 0 0 1 0 0 0 2)
        (gimp-quit 0)
    )
)

(script-fu-register
    "myscript"                          ; 登録する関数
    "myscript"                         ; メニュー項目
    "練習用スクリプト"            ; メニュー項目説明
    "My Name"                           ; 名前
    "My Name"                           ; 名前
    "Aug 15, 2024"                   ; 作成日(改訂日)
    ""                                  ; メニュー項目を有効にするための条件
)

(script-fu-menu-register
    "myscript"                          ; 対象の関数名
    "<Image>/Filters"                   ; メニューの位置
)
```

これをスクリプトフォルダに突っ込んでおく
ワイの場合は以下
```
C:\Users\wainonamae\AppData\Local\Programs\GIMP 2\share\gimp\2.0\scripts\this_script.scm
```

そうすると、gimp実行ファイルへのパスを通していると、コマンドプロンプトから、

```
gimp-2.10 -i --batch="(myscript \"D:/Fig1.svg\")" -b "(gimp-quit 0)" 
```
みたいなコマンドでeps変換が走る。



詳細を見たければお好みで
 --verbose
を後ろにつけると良い。

あとはこれを実行するバッチファイルを作る。

```svg2eps.bat
@echo off
set file=%1
if not defined file (
 	echo please drag and drop file that you want to change extension
	goto eof
)
for %%f in (%*) do (
	if "%%~xf"==".svg" (
		gimp-2.10 -i --batch="(myscript \"%file:\=/%\")" -b "(gimp-quit 0)" 
	) else (
		rem echo %file%
	)
)
rem pause
```


立ち上がるウインドウも消せるようだが、これはやり方が分からなかった。
とりあえずこれでsvgファイルをドラッグアンドドロップしてepsに変換可能である。

本来的には俺達貧者のお絵かきツール決定版であるPowerpointから直接svg+epsで出力したいが、これで時間切れ。
今後の検討事項としたい。





参考

https://www.gimp.org/tutorials/Basic_Batch/

https://stackoverflow.com/questions/11509500/string-replace-in-gimp-script-fu

https://washizu.org/linux/script_fu.htm

http://aiweb.cs.ehime-u.ac.jp/~ninomiya/archive/scheme/

https://gimp.jp.net/writinggimpscripts_basicsofscheme.html