[解決済み] ピクセル単位で正確なサイズの図形を指定し保存する
質問
サイズ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
で図形の大きさを指定する必要があります。
inches
と
dpi
にしか興味はないのですが
画素
がディスクに取り込まれます。どうすればいいのでしょうか?
はっきり言うと、私は、これを
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ピクセル/インチ小さくなるようで、大きな画像サイズには(小さな)影響があるでしょう。この件に関するいくつかの議論
こちら
.
関連
-
ピロウズ画像色処理の具体的な活用方法
-
pythonを使ったオフィス自動化コード例
-
Python カメの描画コマンドとその例
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み] サブプロットで図の大きさを変えるには?
-
[解決済み] カットオフまたはオーバーラップするラベルでパディングを調整する方法
-
[解決済み】大文字と数字を含むランダムな文字列の生成
-
[解決済み】Matplotlibで図のタイトルと軸ラベルのフォントサイズを設定するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
python string splicing.join()とsplitting.split()の説明
-
PythonはWordの読み書きの変更操作を実装している
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み] ImageMagickでSVGをPNGに変換する方法は?
-
[解決済み] Numpyの配列を画像として保存する
-
[解決済み】保存された画像の周りの余白を削除する