1. ホーム
  2. python

[解決済み] ピクセル単位で正確なサイズの図形を指定し保存する

2022-02-12 17:29:42

質問

サイズ3841×7195ピクセルの画像を持っているとします。この図の内容をディスクに保存すると、次のような画像になります。 正確なサイズ ピクセル単位で指定する。

軸もタイトルもない。画像だけです。個人的にはDPIは気にしない。画像が画面に占める大きさをディスクで指定したいだけだからだ ピクセル単位 .

を読みました。 その他 スレッド で、どれもインチへの変換を行い、図の寸法をインチで指定し、何らかの方法でdpiを調整しているようです。私は、ピクセルからインチへの変換によって生じる可能性のある精度の損失への対処を避けたいと考えています。

で試したことがあります。

w = 7195
h = 3841
fig = plt.figure(frameon=False)
fig.set_size_inches(w,h)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(im_np, aspect='normal')
fig.savefig(some_path, dpi=1)

というメッセージが表示されます(Pythonはwidthとheightがそれぞれ32768以下でなければならないと訴えています(?)

私が見た限りでは matplotlib で図形の大きさを指定する必要があります。 inchesdpi にしか興味はないのですが 画素 がディスクに取り込まれます。どうすればいいのでしょうか?

はっきり言うと、私は、これを matplotlib 他の画像保存ライブラリではありません。

解決方法は?

Matplotlib はピクセルを直接扱うのではなく、物理的なサイズと DPI を扱います。あるピクセルサイズの図形を表示したい場合、モニタの DPI を知る必要があります。例えば このリンク はそれを検知してくれます。

3841x7195 ピクセルの画像があったとして、モニターがその大きさである可能性は低く、そのサイズの図を表示することはできません (matplotlib は図が画面に収まるように要求します。大きすぎるサイズを要求すると、画面サイズに縮小されます)。例として、800x800 ピクセルの画像が欲しいとしましょう。以下は、800x800 ピクセルの画像を私のモニタに表示する方法です ( my_dpi=96 ):

plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi)

つまり、基本的にはインチ単位の寸法をDPIで割ればいいわけです。

もし、特定のサイズの図を保存したいのであれば、それは別問題です。画面のDPIはもうそれほど重要ではありません(画面に収まらないような図形を要求する場合は別ですが)。同じように800x800ピクセルの図を例にとると、異なる解像度で保存するために dpi のキーワードを使用します。 savefig . 画面と同じ解像度で保存するには、同じdpiを使用するだけです。

plt.savefig('my_fig.png', dpi=my_dpi)

8000x8000ピクセルの画像として保存するためには、10倍のdpiを使用します。

plt.savefig('my_fig.png', dpi=my_dpi * 10)

DPIの設定は、すべてのバックエンドでサポートされているわけではないことに注意してください。ここではPNGバックエンドを使用していますが、pdfやpsバックエンドではサイズの実装が異なります。また、DPIやサイズを変更すると、フォントサイズなどにも影響が出ます。DPIを大きくすると、フォントと要素の相対的なサイズは同じになりますが、大きな図に小さなフォントを使いたい場合は、DPIではなく物理的なサイズを大きくする必要があります。

例に戻って、3841×7195ピクセルの画像を保存したい場合は、次のようになります。

plt.figure(figsize=(3.841, 7.195), dpi=100)
( your code ...)
plt.savefig('myfig.png', dpi=1000)

なお、ほとんどの画面に収まるように100という数字のdpiを使用しましたが、保存は dpi=1000 で、必要な解像度を得ることができます。私のシステムでは、これは3840x7190ピクセルのpngを生成します -- 保存されるDPIは常に選択された値より0.02ピクセル/インチ小さくなるようで、大きな画像サイズには(小さな)影響があるでしょう。この件に関するいくつかの議論 こちら .