Angenommen, ich habe ein Bild mit einer Größe von 3841 x 7195 Pixel. Ich möchte den Inhalt der Figur auf der Festplatte speichern, um ein Bild mit der genauen Größe zu erhalten, die ich in Pixel angegeben habe.
Keine Achse, keine Titel. Nur das Bild. Ich persönlich interessiere mich nicht für DPIs, da ich nur die Größe des Bilds auf dem Bildschirm auf der Festplatte in Pixel angeben möchte .
Ich habe andere Threads gelesen , und alle scheinen Konvertierungen in Zoll vorzunehmen und dann die Abmessungen der Figur in Zoll anzugeben und die dpis auf irgendeine Weise anzupassen. Ich möchte vermeiden, mich mit dem potenziellen Genauigkeitsverlust zu befassen, der durch Konvertierungen von Pixel in Zoll entstehen kann.
Ich habe versucht mit:
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)
ohne Glück (Python beschwert sich, dass Breite und Höhe jeweils unter 32768 (?) liegen müssen)
Nach allem, was ich gesehen habe, matplotlib
muss die Figurengröße in inches
und angegeben werden dpi
, aber ich interessiere mich nur für die Pixel, die die Figur auf der Festplatte aufnimmt. Wie kann ich das machen?
Zur Verdeutlichung: Ich suche nach einer Möglichkeit, dies mit matplotlib
und nicht mit anderen bildspeichernden Bibliotheken zu tun .
quelle
Antworten:
Matplotlib funktioniert nicht direkt mit Pixeln, sondern mit physischen Größen und DPI. Wenn Sie eine Figur mit einer bestimmten Pixelgröße anzeigen möchten, müssen Sie die DPI Ihres Monitors kennen. Zum Beispiel erkennt dieser Link das für Sie.
Wenn Sie ein Bild mit einer Größe von 3841 x 7195 Pixel haben, ist es unwahrscheinlich, dass Ihr Monitor so groß ist, sodass Sie keine Figur dieser Größe anzeigen können (matplotlib erfordert, dass die Figur in den Bildschirm passt, wenn Sie nach einer Größe fragen zu groß wird es auf die Bildschirmgröße schrumpfen). Stellen Sie sich vor, Sie möchten nur als Beispiel ein Bild mit 800 x 800 Pixel. So zeigen Sie ein 800 x 800 Pixel großes Bild auf meinem Monitor an (
my_dpi=96
):Sie teilen also einfach die Abmessungen in Zoll durch Ihre DPI.
Wenn Sie eine Figur einer bestimmten Größe speichern möchten, ist dies eine andere Sache. Bildschirm-DPIs sind nicht mehr so wichtig (es sei denn, Sie fragen nach einer Zahl, die nicht in den Bildschirm passt). Anhand des gleichen Beispiels für die 800 x 800 Pixel große Figur können wir sie mit dem
dpi
Schlüsselwort von in verschiedenen Auflösungen speichernsavefig
. Um es in der gleichen Auflösung wie der Bildschirm zu speichern, verwenden Sie einfach die gleiche Auflösung:Verwenden Sie eine 10-mal größere Auflösung, um sie als 8000 x 8000 Pixel großes Bild zu speichern:
Beachten Sie, dass die Einstellung der DPI nicht von allen Backends unterstützt wird. Hier wird das PNG-Backend verwendet, aber das PDF- und das ps-Backend implementieren die Größe unterschiedlich. Das Ändern der DPI und der Größe wirkt sich auch auf die Schriftgröße aus. Eine größere DPI behält die gleiche relative Größe von Schriftarten und Elementen bei. Wenn Sie jedoch kleinere Schriftarten für eine größere Figur wünschen, müssen Sie die physische Größe anstelle der DPI erhöhen.
Zurück zu Ihrem Beispiel: Wenn Sie ein Bild mit 3841 x 7195 Pixel speichern möchten, können Sie Folgendes tun:
Beachten Sie, dass ich die Zahl dpi von 100 verwendet habe, um in die meisten Bildschirme zu passen, aber mit gespeichert habe
dpi=1000
, um die erforderliche Auflösung zu erreichen. In meinem System erzeugt dies ein PNG mit 3840 x 7190 Pixel - es scheint, dass die gespeicherte DPI immer 0,02 Pixel / Zoll kleiner als der ausgewählte Wert ist, was sich auf große Bildgrößen (klein) auswirkt. Weitere Diskussion hier .quelle
figsize
zuplt.figure
. Die Lösung bestand darin, zu tun, was die anderen Antworten vermuten lassen, und nach einem Anruf ohnefigsize
- dann anzurufenfig.set_size_inches(w,h)
figure
undsavefig
.Dies funktionierte für mich basierend auf Ihrem Code und erzeugte ein 93-MB-PNG-Bild mit Farbrauschen und den gewünschten Abmessungen:
Ich verwende die letzten PIP-Versionen der Python 2.7-Bibliotheken in Linux Mint 13.
Hoffentlich hilft das!
quelle
Basierend auf der akzeptierten Antwort von tiago ist hier eine kleine generische Funktion, die ein numpy-Array in ein Bild mit der gleichen Auflösung wie das Array exportiert:
Wie in der vorherigen Antwort von tiago erwähnt, muss zuerst die Bildschirm-DPI gefunden werden. Dies kann beispielsweise hier erfolgen: http://dpi.lv
Ich habe
resize_fact
der Funktion ein zusätzliches Argument hinzugefügt , mit dem Sie das Bild beispielsweise in 50% (0,5) der ursprünglichen Auflösung exportieren können.quelle
plt.imsave hat für mich gearbeitet. Die Dokumentation finden Sie hier: https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.imsave.html
quelle