假设我有一张尺寸为 3841 x 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 抱怨宽度和高度必须分别低于 32768(?))
从我所看到的一切来看, matplotlib
需要在 inches
和 dpi
中指定图形大小,但我只对磁盘 像素 感兴趣.我怎样才能做到这一点?
澄清一下:我正在寻找一种方法来使用 matplotlib
而不是使用其他图像保存库。
原文由 Amelio Vazquez-Reina 发布,翻译遵循 CC BY-SA 4.0 许可协议
Matplotlib 不直接处理像素,而是处理物理尺寸和 DPI。如果要显示具有特定像素大小的图形,则需要知道显示器的 DPI。例如, 此链接 将为您检测到。
如果你有一个 3841x7195 像素的图像,你的显示器不太可能那么大,所以你将无法显示那个尺寸的图形(matplotlib 要求图形适合屏幕,如果你要求一个尺寸太大它会缩小到屏幕尺寸)。举个例子,假设您想要一张 800x800 像素的图像。以下是如何在我的显示器中显示 800x800 像素的图像 (
my_dpi=96
):因此,您基本上只需将尺寸(以英寸为单位)除以 DPI。
如果要保存特定尺寸的图形,那就另当别论了。屏幕 DPI 不再那么重要(除非你要求一个不适合屏幕的数字)。使用 800x800 像素图形的相同示例,我们可以使用
dpi
关键字savefig
以不同的分辨率保存它。要以与屏幕相同的分辨率保存它,只需使用相同的 dpi:要将其保存为 8000x8000 像素图像,请使用 10 倍大的 dpi:
请注意,并非所有后端都支持 DPI 的设置。这里使用了 PNG 后端,但 pdf 和 ps 后端将以不同方式实现大小。此外,更改 DPI 和大小也会影响字体大小等内容。较大的 DPI 将保持相同的字体和元素的相对大小,但如果您想要较小的字体用于较大的图形,则需要增加物理大小而不是 DPI。
回到您的示例,如果您想保存 3841 x 7195 像素的图像,您可以执行以下操作:
请注意,我使用 100 的数字 dpi 来适应大多数屏幕,但使用
dpi=1000
保存以获得所需的分辨率。在我的系统中,这会生成一个 3840x7190 像素的 png——似乎保存的 DPI 总是比所选值小 0.02 像素/英寸,这将对大图像尺寸产生(小)影响。 在这里 对此进行更多讨论。