如何使用PIL更改图像的DPI而不保存?

9

我正在尝试通过tesseract处理大量图像。然而,我刚刚发现通过增加dpi可以获得更好的结果。我尝试在StackOverflow上寻找如何可能增加图像dpi的方法,但是我找到的所有答案都涉及在保存文件时更改dpi,类似于以下内容:

img.save('test.png', dpi=(300.0, 300.0))

因此,我想知道是否有可能在不保存文件的情况下实现这一点。
我尝试过以下操作:
image = Image.open('test.png', dpi=(300.0, 300.0)) 

很遗憾,它不起作用。非常感谢您的帮助。

你可以使用BytesIO将文件“保存”到缓冲区中,然后通过打开缓冲区中的图像来重新加载它。from PIL import Image; from io import BytesIO as bio; b = bio(); img = Image.open("my_img.png"); img.save(b, dpi=(300.0, 300.0)); img = Image.open(b); - Shmack
2个回答

5
PNG格式将DPI信息存储在文件中的元数据块中,称为“pHYs”块。因此,您需要寻找一种工具,可以在不读取图像数据本身的情况下编辑或添加这些类型的块到PNG文件中。
一个可以做到这一点的库是libpng,并且存在Python绑定
您还可以查看this question,它解决了相同的问题。显然有一些工具,如IrfanViewImageMagick,可以更改PNG文件,例如在其中放置pHYs元数据块。

嘿,谢谢你的回答,实际上我发现 image = image.resize((1080, 1080)) 就可以解决问题了。 - Nazim Kerimbekov
2
这并不是改变密度,而是通过调整大小来改变图像中的物理像素数量。因此,你的问题是误导性的。 - fmw42

0
刚刚在这里发布了一个回答:如何使用PIL更改保存图像时的dpi或密度,我也发现了这个。我认为在这篇完整的答案中会解答你的问题。简要地说,我建议先保存一个临时文件,然后在使用完毕后将其删除。我找不到任何其他的解决方法。

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