在imsave中的dpi选项

3
考虑以下最小工作示例以生成随机图像:
import matplotlib.pyplot as plt
import numpy as np

pts = np.random.random_sample((1024, 1024))

plt.imsave('foo.png',pts, dpi=300)

我正在尝试理解dpi选项的工作原理。根据matplotlib.pyplot.imsave文档,
"dpi:int
要存储在文件元数据中的DPI。这不会影响输出图像的分辨率。"
上面程序的输出是一个1024x1024的图像文件。
我不明白的是,identify -verbose foo.pngexiftool foo.png都没有显示图像分辨率。
但是,使用ImageMagick(display)打开并检查图像信息,我找到了。

enter image description here

那么,分辨率和打印尺寸值背后的数学原理是什么?

如何获得300dpi的分辨率图像?

2个回答

1

像png这样的图像格式没有定义dpi。如果你通过imsave保存一个1024 x 1024像素的数组,那么图像就只是1024 x 1024像素。

Imagemagick似乎忽略任何元数据,因此它假定分辨率为96 dpi。从像素大小(1024)和dpi(96)计算出尺寸(单位为英寸)。

1024 dots / 96 dots per inch  = 10.667 inch

话虽如此,“如何获取300dpi分辨率的图像?”这个问题并不是很清楚。但是大多数图形查看器允许在打印之前缩放图像,因此在纸上获得300 dpi的打印不应该成为问题。


现在我明白发生了什么。实际上,我想将一个 5000 x 5000 的数组保存为一个 300dpi105mm x 105mmjpg 图像(根据我从出版社得到的指示;所以我不知道这是否有意义)。 - Sigur
好的,但是正如我所说,对于像素图像而言dpi是无关紧要的。因此,如果你需要输出一个5000 x 5000像素的图像,那么你的数组需要进行重采样。 - ImportanceOfBeingErnest
我创建了一个有5000行和列的数组。我想确保当调整大小到105毫米时,图像能以良好的质量打印出来。 - Sigur
105毫米等于4.13英寸。5000像素除以4.13英寸的结果为1200dpi。这被认为是标准打印机的高质量(例如,我的打印机只允许600dpi)。 - ImportanceOfBeingErnest
哦,谢谢。那么,您建议使用“convert”将图像调整为1200x1200吗? - Sigur

1
在ImageMagick中,您可以通过以下方式设置输出密度:
convert image <processing> -density 300 newimage

然后,要检查密度,您可以执行以下任一操作:
identify -verbose newimage

or

identify -format "%xx%y"

找到密度(分辨率)

<processing> 应该是什么? - Sigur
1
无论你想进行哪种处理,如果你不想再做任何进一步的处理,那么只需使用“ convert image -density 300 result ”即可。通过该命令您还可以更改格式,例如“ convert image.png -density result.jpg ”。如果您已经有一个图片并且它已经具有分辨率/密度值,那么只需使用我的其中一个“ identify ”命令即可获取分辨率/密度值。 - fmw42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接