Inkscape 0.92 or laterでXML Editorの座標単位をpxで読み取る

InkscapeのXML Editorで見れる個別要素の座標は単位修飾子の無い”ユーザー単位”ですが、デフォルトではmmで展開され、他の単位については96dpi相当の座標変換を経て描画されることで見かけ上のサイズ・位置を保っています。
これを例えばpx環境にしようとして、Tool Controls Bar(ツールコントロールバー)でpxを選んだり、File(ファイル) -> Document Properties(ドキュメントのプロパティ)のDisplay unitsでpxに変更しただけだと、画面上の座標は反映されて変わるもののXMLの座標に変化はなく、読み取りも書き込みもmmの振る舞いのまま変化がないように見えます。

ユーザー単位はpxの解釈でやり取りしたい場合もあるので、この状況を変更する方法を3通り紹介します。やってることは同じです。ご存じの方はお察しだと思いますが内容的にはScaleの話だけになります。

まず1つめです。上述のDisplay units(以後”表示単位”)をpxに変更したら、下の方にあるScale(拡大縮小)を”0.26458…”(*1)から”1″に変更します。これでOKです。
現在描かれているオブジェクトが一斉に小さく描画されますが、本質であるXMLに変更はありません。つまりXMLの座標で既存のオブジェクトの座標が書き換えられますので、座標を変更する場合は手動で行う必要があります。

このScaleはv0.92以降で登場したInkscape独自のパラメータ(*2)です。
表示単位をScale倍にした数値がXMLに格納され、
XMLの座標を(1/Scale)倍した数値で画面上に描画されます
表示単位をpxにした際、同時にScaleが1.00000…(User units per mm)から0.26458…(User units per px)に変わったのですが、これはXML座標のmm解釈、つまりmm等倍を維持するように動作しています。これをpx等倍にするため1.00000…(User units per px)にするというわけです。
この各々の表示単位用のScale値でXML座標を割って描画することで見かけ上のサイズ・位置を保っており、今回XML座標をpx等倍に解釈するようにしたことで縮んで描画されたということです。またこれで編集値と同じpx座標がXMLに格納されます。
ここを念頭に置かないと画面上ではpxにして編集したつもりでも保存されるSVGが他ツールで意図しない振る舞いになる原因になります。

2つめに、新規での作成に限られますが、この設定で保存されたテンプレートが最初から用意されています。
 File -> New From Template -> default px
を選んで作成すると、先の設定が適応された状態から始めることができます。

3つめに、このテンプレートはInkscape SVGとして下記の場所に保存されています。
Windowsで64bit版を初期状態でインストールした場合、
 C:\Program Files\Inkscape\share\inkscape\templates\default_px.svg
にあります。このファイルを直接、あるいはショートカットから開くことでそのままpx環境で作り始めることができます。

*1)
表示単位をmmからpxに変更したときにScaleに適応される0.26458…という数値は、96dpiにおいて1pxあたり何mmなのかを示しています。

 0.264583 = (25.4mm/inch) / (96dots/inch)

この内部的な解像度を変更する方法はわかりません。v0.92で90dpiから96dpiに変更されたみたいです。古いInkscapeで作ったSVGを開こうとするとこの件に関してどういった対応を取るか選択を問われます。Scaleをどうするかという提案だと思いきや、選択肢次第ではXML座標が書き換えられます
https://inkscape.org/learn/faq/
にこの件に関する公式の説明があります。

以下に、私の調べた限りの情報・推測を書きます。

まず、Inkscapeでは、XMLのルート要素にあるwidth,height属性(=ページサイズ)とは別に、最近ではviewBox属性が最初から設定されます。
この属性はSVGの仕様として策定されているもので、値としてはページサイズのようなものが設定されています。多分SVGの規格的に同値で生成されます。
この例に限らず、単位修飾子の無いユーザー単位をviewBox属性を用いてページ上にマッピングすることをユーザー座標系と呼びます。

この度のScaleはこのマッピング、つまりページサイズとviewBoxとの相似比を指します(簡単のためにアスペクト比は等しいものとします)。

v0.48では、viewBox属性がなく、ページサイズ自体に90dpi換算されたpx値が格納されていました。このバージョンは完全にpx環境ですので、XML座標はpxと思って大丈夫だと思います。

v0.91では、ページサイズには単位修飾子がついた値、viewBox属性にはページサイズを90dpi換算したpx値が格納されていました。

v0.92以降ではScaleが出現し、ページサイズには単位修飾子がついた値、viewBox属性にはページサイズを表示単位でScale倍した値が格納されます。デフォルトではページサイズはmm修飾子、Scaleはmm等倍です。つまりページサイズ=viewBoxの状態です。

件のダイアログはv0.48のファイルで発生しました。

1:
上の
“This file contains digital artwork for screen display. (Choose if unsure.)
は、Webページのロゴのように、編集工程も出力物もpx環境だったと想定できるものはこれを選ぶと良いでしょう。最も安全な選択肢で、何もしないで閉じるときに「変更を保存しますか?」と聞かれません。Scaleはpx等倍になり、当時のバージョンではpx等倍値であるXML座標にも当然変更は見られません。全てがpx等倍で統一されていますので、旧バージョンそのままに表示されることでしょう。
Tool Controls Barでmm等の実寸値に変更してみると現バージョンに則り96dpi相当の換算座標になります。

2:
下の
“This file is intended for physical output, such as paper or 3d prints.”
を選ぶと、さらに2択のオプションが出てきます。これらはDTPやプロッター、3Dプリントなど、物理的な出力を目的に作られたファイルを想定しており、実寸値を保持する選択肢です。

2-a:
“The appearance of elements such as clips, masks, filters, and clones is most important. (Choose if unsure.)
これは個々の要素は変更せずページごとスケーリングする手法です。DTP目的のファイルなどで、印刷時の見た目が保たれていれば良い場合などはこれが安全な選択肢です。

XMLは個別要素の座標が変更された様子はありませんが、v0.48におけるページサイズ属性値(90dpi換算px値)がviewBox属性値に移り、ページサイズ自体は(1/0.9375)倍されたpx値になっています。v0.48のDocument Propertiesで実寸単位で指定していた場合は単位修飾子付きの実寸値になります。ということでScaleがpx比0.9375=(90dpi/96dpi)になっています。
これで分かることは、ページサイズが実寸表現だったと想定する選択肢ということです。
つまり、v0.48での全体の座標関係がpx等倍環境としての統一を保持することでviewBox上で保たれる一方、ページサイズだけは解像度変更のあおりを受けています。
これをもしScale=1(px等倍)、つまりviewBox値をページサイズと合わせた場合、90dpi -> 96dpiとなったページサイズ比較で各要素が縮んで描画されてしまいます。そこでScaleがこのような値になっているという要領です。

2-b:
“The accuracy of the physical unit size and position values of objects in the file is most important. (Experimental.)”
実験的、と括弧書きされています。XML座標がページサイズ含め一斉に書き換えられます。下の Create a backup file にはチェックを入れておくことを推奨します
各要素のXML座標を個別に(1/0.9375)倍した値に書き換え、Scaleはpx等倍となります。
2-aの方法ではviewBoxに旧バージョンの空間を保持することで見かけ上は補正できていても、各要素自体は90dpi環境でのpx等倍座標値のまま変更が加えられていません。この2-bではパスデータなどを他の96dpi環境と相互利用する際に足並みが揃うよう根本から変えてくれます。

*2)
調べたところ、scale某というような名称の属性は見当たらなく、本文中にも書きましたが実際にはページサイズ値とviewBox値の相似比をScaleとして表す仕組みのようです。
これは今回の一番肝心の部分かもしれませんが、SVGの規格はこのユーザー座標系を利用することで、使用ツールの環境次第で柔軟に変化できるようにしています。

仮にA4のドキュメントを作りたいとして、ページサイズを
1. 210mm*297mm
2. 793.7px*1122.5px@96dpi
という表現で2つ用意したとします。ここで一旦単位のことを忘れます。

“h 50″という、ユーザー単位で表されたXML座標を考えます。
viewBoxが(210, 297)のとき、50/210、viewBox幅の大体1/4に渡って描かれ、
viewBoxが(793.7,1122.5)のとき、50/793.7、viewBox幅の大体1/16に渡って描かれる
というだけの話で、その分母に人間が勝手な解釈を加えているだけに過ぎません。
前者が210mmの意味であればこれは50mmとなりますが、210pxを想定しているなら50pxと考えられ、後者793.7もpxを想定しているなら50pxですが、793.7inchなら50inchと考えられます。
しかし、どんな解釈であれ変わらないのが、50/210などの位置関係です。
ユーザー単位で表された各要素座標は、viewBoxの座標系に必ず1:1で対応します。

では実際には何の単位で取り扱えばいいのか?ここでページサイズです。単位修飾子がなければ仕様上pxの座標系として扱われるはずです。
793.7を210mmの意味にして!100px*100pxのページサイズで作ったドット絵をA4いっぱいに表示したい!となった時、ページサイズをA4実寸値あるいは96dpi換算した値に書き換えるだけで事が足り、その変更がScaleに現れます。
実際にはこのようなイレギュラーな運用はしないと思いますが…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

この投稿へのトラックバック: https://plugman.me/2020/05/17/890/trackback/