Inkscapeでは、ファイルに保存するときやファイルから読み込むときなどいろんな場面で、解像度を指定する画面が現れることがあります。

そこで、画面上で指定した解像度にどのような意味があるのかを、PNG画像ファイルとPDFファイルについて調べてみました。
- Contents
- はじめに
- そもそも解像度って何?
- ファイルの解像度を試してみた
- PNG画像にエクスポートするときは?
- PNG画像ファイルをインポートするときには?
- DPIとピクセル数の関係
- PDFファイルにエクスポートするときは?
(参考:ディスプレイの解像度の話)
(参考:「長さ」の単位について)
(2024.09.10更新)
そもそも解像度って何?
単位長さあたりのドット(またはピクセル)の数(つまりドットの密度)のことで、DPI(Dots Per Inch)と呼ばれる単位(1インチあたりの数)で表すことが多いけれど、1mあたりの数で表す場合もあります。
ややこしいのは、表示する際の画面のほうのドットの密度を意味するときと、表示されるビットマップ画像データのピクセルの密度(単位長さあたり何個のピクセルで描かれる画像か)を意味するときがあるようで、後者の場合「Pixels Per Inch」という言い方が正しそうなのですが、いろいろ検索してみるとそんなにはっきり区別して使われているわけではないという印象です。
1ピクセルを1ドットで出力するものと仮定すると、あるピクセル数のビットマップ画像を低い解像度で出力すると大きく表示され、高い解像度で出力すると小さく表示されます。あるいは、低い解像度で保存されているビットマップ画像と高い解像度で保存されているビットマップ画像を同じ大きさで表示すると、前者は「荒い」表示になり後者は「細かい」表示になります。
一方、ベクタデータであれば、画面の解像度に関係なく、ものさしで測れる長さの情報を内部に持っていて、その長さに応じて表示するので、ドットやピクセルの密度(すなわち解像度)は特に気にする必要はないはずですが・・・。
ファイルの解像度を試してみた
さて、次のような図形を描いて、PNG画像ファイルとPDFファイルとで読み書きしてInkscapeでは何が起こるのかを試してみました。

ちなみに、大きさが分かりやすいように、1辺が1cmの矩形を描いてあります。
PNG画像にエクスポートするときは?
エクスポートダイアログを表示すると、次のようにDPIを指定する欄があります。

ここにDPIの値を指定し、エクスポート形式としてPNG画像を指定すると、Inkscapeの画面(ディスプレイ)の解像度ではなく、ここで指定した解像度(密度)でピクセルが並んだビットマップ画像に変換されてPNG画像ファイルとして保存されます。解像度の代わりに横(幅)と縦(高さ)のピクセル数を指定することもできます。その場合はエクスポート対象のピクセル数と指定したピクセル数から求めた解像度が自動的にDPI欄に表示されます。
多くのディスプレイは96dpiなので、Inkscapeのオブジェクトは1インチあたり96ピクセルでディスプレイに表示されており、PNG画像ファイルへの保存時の解像度も同じ「96」を指定すると、画面に表示されている絵のピクセル数のままで保存されることになります。
一方、300dpiを指定すると、1インチあたり96ピクセルで表示されているオブジェクトを1インチあたり300ピクセルの画像に変換して保存するので、画面上のピクセル数に対して「300 / 96」のピクセル数で保存されます。だいたい3倍ぐらいのピクセル数になります。サンプル図形の場合は1辺が1cmなので、300dpiを指定すると、1辺を118ピクセルに変換したビットマップ画像で保存されることになります。
また、30dpiを指定すると、「30 / 96」のピクセル数で保存されます。画面上の見た目よりもかなり荒っぽい画像データになるという感じです。サンプル図形の場合は、1辺1cmを12ピクセルに変換させるので、かなり荒い画像です。
ところで、解像度を指定してエクスポートボタンを押す前に、エクスポート形式としてPNG画像を指定したメニューの右隣りにある「歯車」のアイコンをクリックすると、保存時のPNG画像のパラメータを指定する小さいダイアログが表示されます。

このダイアログにも解像度(pHYs DPI)を指定する欄があります。
こちらは、どんな解像度(1インチあたりのピクセル数)で表示することを期待しているのかを指定します。普通なら、エクスポートダイアログ上で指定した解像度と同じにするところだと思いますが、別の解像度を指定することもできます。
そして、ここで指定した解像度はPNG画像ファイルの中に「Physical pixel dimension」という名前のパラメータ値として埋め込まれます。このPNG画像を表示する際は各ピクセルをここに含まれている解像度(密度)で表示するのが理想なのだと思いますが、手元にある各種画像表示アプリケーション(ペイントやブラウザなど)で表示すると、PNG画像ファイル内に指定されている解像度は無視されて、画像ファイルの中のピクセルをディスプレイの解像度(例えば96dpi)で表示するだけなので、例えば300dpiでビットマップ画像化したピクセル数の多い画像は大きく表示され、30dpiでビットマップ画像化したピクセル数の少ない画像は小さく表示されるだけです。
PNG画像の中に埋め込まれている解像度(pHYs DPI)に従って表示してくれるアプリケーションにはどんなものがあるのかを探してみたのですが、見つかりませんでした。ひょっとするとディスプレイ上に表示しようとするアプリケーションはディスプレイの解像度を優先するのでpHYs DPIの値は基本的に無視するけれど、紙に印刷するときなどはpHYs DPIの解像度に従うのかもしれません。
例えば「高さ1000ピクセル、幅2000ピクセルで解像度300dpiの画像ファイルにして」というリクエストがあった場合、画像サイズはDPIではなく幅と高さのピクセル数を指定し、pHYs DPIのほうに「300」を指定してエクスポートします。この場合は画像サイズのほうの解像度(自動的に計算されるもの)がいくつになるかは気にする必要はないはずです。
PNG画像ファイルをインポートするときには?
ファイル > インポートメニューでPNG画像ファイルをキャンバスにインポートしようとすると、次のようなダイアログが表示されます。

ここには、インポートするPNG画像の解像度として何を採用するのかを指定するところがあります。
ファイルからを選ぶと、PNG画像ファイルに含まれている解像度(つまり「Physical pixel dimension」の値)を使い、デフォルト…を選ぶと、環境設定のデフォルトのインポート解像度に設定してある解像度を使うそうです。
実際にやってみると、どちらを選んでも結果は変わらない(ピクセル数に応じた大きさで表示される)ので、この選択の効果はわかりませんでした。まだ見えていないところに影響が出ているのかもしれませんが。
DPIとピクセル数の関係
ちなみに、DPIの値とピクセル数の関係は次のような感じです。
(1inch = 25.4mm)
30dpi 1cmあたり12ピクセル 1mあたり1181ピクセル
96dpi 1cmあたり38ピクセル 1mあたり3780ピクセル
300dpi 1cmあたり118ピクセル 1mあたり11811ピクセル
PDFファイルにエクスポートするときは?
PDFファイルにエクスポートする場合も、エクスポートダイアログには解像度を指定する欄があって、エクスポート形式としてPDFを選んでもこの欄は入力可能になっています。
ただ、何らかの解像度を指定しても、結果として保存されるPDFファイルに違いがあるように見えない(表示しても同じにしか見えない)ので、PDFファイルへのエクスポートの際は解像度の違いは無視されている(というか、ビットマップ画像じゃないので、違いが出るはずがない?)ということなのだと思います。
さらに、エクスポート形式としてPDFを指定したメニューの右隣りにある「歯車」のアイコンをクリックすると、エクスポートダイアログとは別に、次のようなダイアログが表示されます。(横長に表示されてちょっと見にくいですが)

このダイアログではエクスポートダイアログで指定可能な「保存形式によらない共通のパラメータ」以外の、その保存形式(この場合はPDF)に特有のパラメータを指定します。
そしてこのダイアログにも「ラスタライズ解像度」という項目があります。これはInkscapeでオブジェクトに対して何らかのフィルタを設定している場合に、どのぐらいの細かさでフィルタをかけるのか、すなわちフィルタ適用直前にInkscape内部でフィルタ適用対象としてオブジェクトから生成される(ラスタライズされる)画像の解像度を指定するものとのことです。保存後のビットマップ画像の解像度ではないのですね。当たり前ですが、フィルタを設定していないオブジェクトについては「ラスタライズ解像度」にどんな値を指定してもエクスポート結果に影響がなさそうです。
上のサンプル画像(1cmx1cmの四角)で何かしらフィルタをかけておいてから、このダイアログ上で300dpiを指定して保存すると、次のようなPDFになります。

一方、低い階層度として30dpiを指定して保存すると、フィルタを適用する直前のInkscape内部のビットマップ画像が粗い画像になるので、次のようなPDF(フィルタの結果がぼやっとしたもの)になります。解像度の低い画像にフィルタを適用するとその結果も粗いものになるということだと思います。

フィルタと解像度(ピクセル数)の関係については「オブジェクトを拡縮するとフィルタはどうなる?」も参考になるかもしれません。