假设我有一个大小为 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
inches
dpi
澄清一下:我正在寻找一种方法来做到这一点matplotlib,而不是使用其他图像保存库。
Matplotlib 不直接使用像素,而是使用物理尺寸和 DPI。如果要显示具有一定像素大小的图形,则需要知道显示器的 DPI。例如,此链接将为您检测到。
如果您有 3841x7195 像素的图像,那么您的监视器不太可能会那么大,因此您将无法显示该尺寸的图形(如果您要求尺寸,matplotlib 要求该图形适合屏幕太大会缩小到屏幕尺寸)。假设您想要一个 800x800 像素的图像,仅作为示例。以下是如何在我的显示器 ( my_dpi=96) 中显示 800x800 像素的图像:
my_dpi=96
plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi)
因此,您基本上只需将尺寸(以英寸为单位)除以 DPI。
如果要保存特定大小的图形,那就另当别论了。屏幕 DPI 不再那么重要(除非您要求的图形不适合屏幕)。使用 800x800 像素图形的相同示例,我们可以使用dpi关键字 of将其保存为不同的分辨率savefig。要将其保存为与屏幕相同的分辨率,只需使用相同的 dpi:
savefig
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 x 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 像素/英寸,这将对大图像尺寸产生(小)影响。
dpi=1000