WindowsでInkscapeをCUI経由で使う

コマンドライン経由でSVGをラスター画像に / 2023-01-13T00:00:00.000Z

次回の記事を執筆するためにRで生成した散布図をSVG出力したのですが、その結果186MBもあるブラウザ破壊ファイル(クリック注意)を生み出してしまいました。さすがにブラウザ破壊ファイルを皆さんのブラウザにお届けするわけにはいかなかったので、CUI経由でInkscapeを用いPNGファイルを生成しました。GUIでなくともInkscapeを使用して画像を変換できることが知られていないと思ったので、その変換方法について簡単に解説してみようかと思います。

結論

  1. 何も考えずにSVGファイルを生成すると大変なことになる
  2. COMファイルを使う
  3. ヘルプをよく読む

222万点のSVG(186MB)

詳しい話は次回の記事を参照していただきたいのですが、Excelで扱えない程度の大量のデータを基に散布図を作る必要が出てきてしまいました。そのためR言語を用いて散布図を作ることにし、以下のようなコードを作成しました。

library(tidyverse)
library(svglite)
data <- read.csv("sample_gtc_data_clean_220919.csv", header=T, sep=",") 
%>% select(c(r_guess,r_true))

cor.test(data$r_guess,data$r_true) #相関係数確認

result <- ggplot(data, aes(x = data$r_guess, y = data$r_true)) + 
  geom_point() + 
  labs(title="ユーザーの予測した相関係数と実際の相関係数の関係", 
  x="ユーザーの予測した相関係数", y="実際の相関係数")

ggsave(filename="./gtcplot_20190922.svg", plot=result)

ggplot2を用いた一般的な散布図を作成するコードで、これをsvgliteを用いてSVGとしています。ここで問題なのはデータの個数で、2226387個あるらしいことがこれを実行する前に分かってしまっていました。ソース元から落とした上で解凍したCSVファイルが213MBもあった時点で嫌な予感はしていましたが、何とかなるの精神で生成したところ、生成されたgtcplot_20190922.svg186MBとなってしまいました。

さすがに不味いと思って適当なブラウザで開いてみたのですが、5分経っても点が描画され続ける異常事態になってしまいました。快適にPCを使える環境として最低限レベルのハードは少なくとも持っているので、スマートフォンで表示したらどうなるかを想像すると、何とも言えない気持ちになってしまいました。そのためPNGやJPEGに変換して、正確性を犠牲にしながらも閲覧して下さった人のデバイスを破壊するような事態を防ごうと思いました。万が一神奈川県警に捕まっても困りますからね。

inkscape(MS-DOSアプリケーション)

私はFFmpeg大好き星人なので画像の変換にも使用しているのですが、残念ながらFFmpegはSVGの入出力に対応していません。そのため変換を行おうとする方の大半はImageMagikを使うかと思われます。しかし私は新しいソフトウェアをインストールするのが億劫であったため、可能な限り手元にあるソフトウェアを用いて問題を解決しようと思いました。3秒ほど思案した結果、Inkscapeを使用することを思いつきました。

Inkscapeはこのサイトに掲載されている終わった画力の画像を生成するのに使われているSVGお絵描きツールで、きちんとした画力を持っている方が使えばAdobe illustratorと同様のベクター画像を作り出せる自由ソフトウェアです。お絵描きツールであるから想像できるかと思いますが、基本的にGUI経由で使用するソフトウェアです。ただよくよく調べてみるとCUI経由でも使用できることが分かりました。InkscapeにはSVGをPNGなどにエクスポートする機能がありますので、使えるかどうか確認していきましょう。

Windowsにおいてcmdから起動する実行ファイルのフォルダは基本的に環境変数内に格納しておく必要があります。しかしInkscapeをCUI経由で使う機会などそうそうないので、そのままパスを指定して起動してしまいましょう。

"C:\Program Files\Inkscape\bin\inkscape.com" --version
Inkscape 1.2 (dc2aedaf03, 2022-05-15)

きちんとバージョンが表示されましたね。ところでこの実行したコマンドを見て疑問を持つ方がいらっしゃるかもしれません。ここで呼び出している実行ファイルは「inkscape.com」で、現代のWindowsで標準的に用いられている「inkscape.exe」ではないため、なぜわざわざMS-DOSアプリケーションを用いている理由があるのか明確ではないためでしょう。この疑問について私は明確な答えは持てていないものの、「.exe」を指定して実行しても何も返ってこないからというのが実情です。「.com」を呼び出した際には上記の通りきちんと使えるのですが、「.exe」を呼び出した際には特に何も起こらない、少なくともコマンドプロンプト状では何も起こらないのです。この理由はよく分からないのですが、取り敢えず「.com」を呼び出していただければ使えることは確かです。

取り敢えず使えることが明らかとなったので、取り敢えず内蔵ヘルプを表示してみましょう。「"C:\Program Files\Inkscape\bin\inkscape.com" -?」を実行すればヘルプが出てきます。インターネット上では「こうすればCUI経由でInkscapeが使える!」といったサイトが散見されますが、その多くはLinuxベースのもので情報も若干古いものです。そのためヘルプを丁寧に見ることによって、現代のWindowsでそのコマンドが実行できるかどうかを確認することが出来ます。その結果以下のようなコマンドが出来上がりました。

"C:\Program Files\Inkscape\bin\inkscape.com" \
-p gtcplot_20190922.svg -o gtcplot_20190922.png

大層なことを書いた割にはシンプルなコマンドですね。ちなみに出てきたPNGファイル(111kB)は以下に掲載しています。

2019年9月22日時点での散布図

詳しいことについては次回の記事を参照していただきたいのですが、横軸がユーザーの予測した相関係数、縦軸が実際の相関係数です。一応テキストを描画したつもりなんですが、消えてしまっていますね。といってももう一度生成したくないのでそのまま掲載します。

最後に

前回の技術関連の記事: Slackのプライベートリポジトリが年末年始に不正アクセスされる

何も考えずにSVGを生成すると、もはや爆弾レベルのSVGファイルを爆誕させてしまうことがあることが分かりました。変換途中にRAMが10GBを超えるレベルで食われてしまったことから、ブルースクリーンが出てしまわないか不安な気持ちになってしまったので、当分爆弾SVGを生成しようとするのは辞めようと思いました。

Writer

Osumi Akari