ドーモ
ユーザーさん
German=Ninjaデス
SVGファイルをEPSファイルに変換したい。
そういう事情があった。
オープンソースでこれができるのは、InkscapeとGIMPだろう。
Inkscapeは、しかし、svgファイルの素材の透明部分がうまく処理できない。
具体的には以下の内容のSVGファイルを考える。
いらすとや様とパワーポイントで適当に作ってSVG出力したようなアレだ。
これをInkscapeでepsとして出力すると、
こんな感じになってしまう。どうしてどうして。
悲しい悲しい。
Inkscapeは自分でepsとしたファイルを開こうとすると失敗するのも辛い。
というわけでGIMPを使うことにしたのだ。
で、結構クリック要求が激しいので、これはもう自動化したい。
GIMPにもInkscapeもCLIが存在するようで、
GIMPの場合はScript-fuとかいうようだ。
憧れのLISPの方言のようで、これを機会に手を付けてみる。
色々調べて、以下のコードを作った
string-replaceの部分はStack overflowから直輸入している。
ありがとうございます。
(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
を後ろにつけると良い。
あとはこれを実行するバッチファイルを作る。
@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で出力したいが、これで時間切れ。
今後の検討事項としたい。
参考