Python Matplotlib如何保存精确像素尺寸图像并调整宽高比
问题根源
你之前调不准像素尺寸的核心原因有两个:
- 你在
savefig里加了bbox_inches='tight'参数,这个参数会触发matplotlib自动裁剪画布边距,直接覆盖提前设置的画布尺寸,不管怎么计算dpi都会出现偏差 - 你没有按照「画布英寸尺寸 × dpi = 输出像素尺寸」的固定公式设置参数,靠手动试凑dpi当然没法得到精准结果
方案1:需要用matplotlib渲染的场景(比如要叠加绘图元素、标注)
完全不需要反复试dpi,你可以随便定一个好算的dpi值(比如常用的100),反过来推算画布尺寸即可,核心公式非常简单:fig宽(英寸)= 目标像素宽 / dpifig高(英寸)= 目标像素高 / dpi
对应你要输出11230×11229像素的图,直接用下面的代码即可,边距已经设为0,不会产生多余白边:
import matplotlib.pyplot as plt # 定义目标像素尺寸 target_w = 11230 target_h = 11229 my_dpi = 100 # 可任意设置为整数,不影响最终输出像素精度 fig, ax = plt.subplots(figsize=(target_w/my_dpi, target_h/my_dpi), dpi=my_dpi) plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) plt.axis('off') plt.imshow(superpositionFINAL) # 注意必须去掉bbox_inches='tight'参数,否则会破坏预设尺寸 plt.savefig('myImage.png', pad_inches=0, dpi=my_dpi) plt.close()
运行后输出的图像素尺寸完全匹配设定值,如果要调整宽高比,直接修改target_w和target_h的数值即可,不需要额外调整其他参数。
方案2:仅需读写、修改图像尺寸的场景(不需要额外绘图)
如果你只是要读取图像、调整尺寸后保存,完全没必要用matplotlib,很容易踩画布、边距相关的坑,直接用Pillow(PIL)处理即可,代码更简洁、处理速度更快,像素精度100%可控:
from PIL import Image # 如果直接处理代码里的numpy数组格式图像 img = Image.fromarray(superpositionFINAL) # 如果从本地文件读取则用 img = Image.open('原图像路径.png') # 直接调整到目标像素尺寸:宽11230,高11229 resized_img = img.resize((11230, 11229)) resized_img.save('myImage.png')
这个方法不需要关心dpi、画布、边距这些冗余概念,尺寸参数直接对应输出像素值,宽高比可以任意调整。
补充:resize方法默认使用邻近插值,如果需要更高的缩放质量,可以传入第二个插值参数,比如
Image.Resampling.LANCZOS适合缩小图像,Image.Resampling.BILINEAR适合放大场景,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者chang thenoob
相关产品推荐
相关产品推荐

