Python PIL 设置图片的 DPI 分辨率和压缩比

更新日期: 2025-08-19 阅读次数: 51 字数: 654 分类: Python

昨天搞定了 CMYK 图片模式的问题,参考前文 CMYK 印刷展板图片批量生成,Python 程序踩坑记。发现生成的图片文件过大,跟示例图片差了快 3 倍,完全无法接受。 而且图片的 DPI 分辨率也不对,导致打印出来的展板宽高与预期不符。所以将 Python 生成图片的代码又调整了一下参数。

优化后的代码

save_kwargs = {
	"format": "JPEG",
	"quality": 80,
	"optimize": True,
	"dpi": (150, 150)
}
if icc_profile:
	save_kwargs["icc_profile"] = icc_profile

output_img.save(output_path, **save_kwargs)

图片压缩

默认质量 100 生成的图片大小很大, 33M 大小。而从设计那边拿到的示例 JPG 图片只有 13M 大小。 而且肉眼看不出差异。所以,我想能不能设置一个压缩参数来减少图片的大小。

  • quality: The image quality, on a scale from 1 (worst) to 95 (best). The default is 75. Values above 95 should be avoided; 100 disables portions of the JPEG compression algorithm, and results in large files with hardly any gain in image quality. 我之前设置了 100 相当于禁用了 JPG 的压缩算法。。。
  • optimize: If present, indicates that the encoder should make an extra pass over the image in order to select optimal encoder settings.

设置之后,生成的图片大小变成了 12M。

分辨率

由于生成的图片需要送去打印店打印,所以除了宽高的像素数需要按照需求来,同时分辨率也需要一致,才能保证打印出来的展板实际宽度和高度跟预期一致。

从 PhotoShop 中查看图片参数,可以看到:

图片 DPI

分辨率是 150,单位为 DPI(每英寸点数,即像素/英寸)。DPI 的英文全称是 Dots Per Inch。DPI 越高,图片越清晰。

而我用 Python 生成的图片默认分辨率是 70 DPI。会导致实际打印出来的展板宽高与需求不符。

解决方法就是在 Save 时,指定 dpi 参数:

"dpi": (150, 150)

为何是两个参数呢?分别表示图片的 水平 DPI(X 方向) 和 垂直 DPI(Y 方向)。

A tuple of two numbers corresponding to the desired dpi in each direction.

设置之后实际宽高就没问题了。之前从没搞过印刷体的图片,以为跟网上图片一样设置好像素宽度就可以了。 没用的知识又增加了 😮‍💨。

警告信息

.local/lib/python3.8/site-packages/PIL/Image.py:3176: DecompressionBombWarning: Image size (113886180 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack.
  warnings.warn(
  • 在处理大图像时,可能会遇到 PIL 库的 DecompressionBombWarning 警告。这是因为图像尺寸超过了库的安全限制。
  • 如果确定图像来源可靠,可以通过调整库的配置来忽略此警告

关于作者 🌱

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式