これはなに
Inkscape でPSDファイルを出力するのに多少苦労したので、対応策を備忘録として残しておく。
環境
結果だけ知りたい人のために
InkscapeでPSDファイルを出力するための設定手順を下記に記す。
- Inkscape とGIMP をインストールする
- GIMPのパスを通す
- スタートメニューの検索窓で「環境変数を編集」を検索し開く
- 「ユーザー環境変数」にある「Path」を選択して「編集」をクリック
- 「新規」をクリックしてGIMPをインストールしたパス(デフォルトなら
%PROGRAMFILES%\GIMP 2\bin
)を追加する - 「OK」をクリックして保存する
- 管理者権限でコマンドプロンプトを起動する
- GIMPへのパスが通っているか確認する
- コマンドプロンプトに
gimp-2.10
と打って実行(Enter)し、GIMPが起動すればOK
- コマンドプロンプトに
gimp
コマンドでgimp-2.10.exe
が起動するようにする- 管理者権限でコマンドプロンプトを開き、
fsutil hardlink create "%PROGRAMFILES%\GIMP 2\bin\gimp.exe" "%PROGRAMFILES%\GIMP 2\bin\gimp-2.10.exe"
を実行する -> ハードリンクが生成される - コマンドプロンプトに
gimp
と打って実行(Enter)し、GIMPが起動すればOK
- 管理者権限でコマンドプロンプトを開き、
- Inkscapeにgimp_psdのextensionを追加する
- ここ からファイルをダウンロードし、任意の場所に保存する
- Inkscapeをインストールしたディレクトリを開く(デフォルトなら
C:\Program Files\Inkscape
) - その中の
share\inkscape\extensions
内に、ダウンロードしたファイルのgimp_psd.inx
とgimp_psd.py
を入れる
以上を設定すると、InkscapeでPSD形式のファイルを保存できるようになる。
背景
InkscapeはデフォルトでPSDファイル出力をサポートしていない。 しかし、GIMPを利用してInkscapeからPSDを出力するextension「gimp_psd 」が、junichi11 さんによって開発されている。 これを適用すれば簡単にInkscapeでPSDファイルを出力できる。
…と思っていたのだが、単に適用しただけではInkscapeにエラー(FileNotFoundError
)を吐かれてしまう。
下記にエラーの一例を示す。
Traceback (most recent call last):
File "C:\Program Files\Inkscape\share\inkscape\extensions\gimp_psd.py", line 179, in <module>
GimpXcf().run()
File "C:\Program Files\Inkscape\share\inkscape\extensions\inkex\base.py", line 231, in run
self.save_raw(self.effect())
File "C:\Program Files\Inkscape\share\inkscape\extensions\inkex\base.py", line 277, in save_raw
self.save(self.options.output)
File "C:\Program Files\Inkscape\share\inkscape\extensions\gimp_psd.py", line 175, in save
with open(xcf, 'rb') as fhl:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\<User Name>\\AppData\\Local\\Temp\\gimp-out-xxxxxxxx\\hogehoge.psd.psd'
何が問題だったのか
gimp_psdのプログラムにバグが生じていた。
GIMPのコマンドにパスを含む引数を渡すときに、なぜかはわからないが、パス区切り文字の\\
が無視されていた。
そのため、InkscapeがTemp\\gimp-out-xxxxxxxx
ディレクトリに吐いた.pngファイルへアクセスできず、GIMPのコマンドが何も吐かずに終了していた。
よって、GIMPによって生成されるはずのhogehoge.psd.psd
が生成されず、FileNotFoundError
が生じた。
なお、パス区切り文字が\\
になるのはWindowsだけなので、MacやLinuxではこのバグは生じないと思われる。
どう解決したのか
実行OSがWindowsのときだけ、パス区切り文字の\\
を/
に置換して、GIMPのコマンドでパス区切り文字が無視されないようにした。
具体的には、gimp_psd -> gimp_psd.py の115行目以降に、下記のように手を加えた。
xcf = os.path.join(self.tempdir, "{}.psd".format(self.docname))
if os.name == 'nt': # NOTE: if Windows
xcf = xcf.replace(os.sep,'/')
for k, v in pngs.items():
pngs[k] = v.replace(os.sep,'/')
こうすることで、パス区切り文字が無視されなくなり、正常にPSDファイルが出力されるようになった。
ちなみに
GIMPにパスを通すとInkscapeの出力ファイルに追加される.xcf
の出力も、同じエラーで動かないと思われる。
適用しても動かないときに確認すること
まずはコマンドプロンプトでgimp
コマンドを実行し、GIMPが起動するか確かめること。
GIMPにパスを通さないと動かない。
GIMPが起動しない場合は、環境変数にGIMPのパスが登録されていることを確認する。
パスが登録されていても動かないなら、GIMPを再インストールする。
それでも動かなければ、こちら にIssueを投げてほしい。
おわりに
junichi11 さんに、あらためて感謝の意を申し上げる。 このコードがなかったら諦めていただろう。