0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GIMPでバッチ処理を行う

Posted at

ドーモ
ユーザーさん

German=Ninjaデス

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

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

具体的には以下の内容のSVGファイルを考える。
いらすとや様とパワーポイントで適当に作ってSVG出力したようなアレだ。
image.png

これをInkscapeでepsとして出力すると、
こんな感じになってしまう。どうしてどうして。
悲しい悲しい。
image.png

GIMPであれば問題なくこんな感じに
image.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で出力したいが、これで時間切れ。
今後の検討事項としたい。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?