以像素为单位指定和保存精确大小的graphics

假设我有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需要以inchesdpi为单位指定graphics大小,但我只关心graphics在磁盘中的像素 。 我怎样才能做到这一点?

澄清:我正在寻找一种方式来做到这一点与matplotlib ,而不是其他图像保存库。

Matplotlib不直接使用像素,而是物理尺寸和DPI。 如果你想显示一个像素大小的数字,你需要知道你的显示器的DPI。 例如, 这个链接会检测到你。

如果您的图像尺寸为3841×7195像素,则显示器的尺寸可能不会很大,因此您将无法显示该尺寸的graphics(matplotlib要求graphics适合屏幕,如果您要求尺寸太大,会缩小到屏幕尺寸)。 让我们来想象一个800×800的像素图像。 以下是如何在监视器中显示800×800像素的图像( my_dpi=96 ):

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

所以你基本上只是用DPI把尺寸除以英寸。

如果你想保存一个特定大小的数字,那么这是一个不同的问题。 屏幕DPI不再那么重要(除非你要求一个不适合屏幕的数字)。 使用800×800像素图的相同示例,我们可以使用savefigdpi关键字以不同的分辨率保存它。 要将其保存为与屏幕相同的分辨率,只需使用相同的dpi:

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

要将其保存为8000×8000像素的图像,请使用大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) 

请注意,我使用的dpi的dpi dpi适合大多数屏幕,但保存为dpi=1000以达到所需的分辨率。 在我的系统中,这产生了3840×7190像素的PNG – 看起来DPI保存的总是比所选值小0.02像素/英寸,这对大图像尺寸会有(小)影响。 这里有更多的讨论。

这对我来说,根据您的代码,生成一个93Mb PNG图像与色彩噪音和所需的尺寸:

 import matplotlib.pyplot as plt import numpy w = 7195 h = 3841 im_np = numpy.random.rand(h, w) 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('figure.png', dpi=1) 

我正在使用Linux Mint 13中的Python 2.7库的最后一个PIP版本。

希望有所帮助!