You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Matplotlib savefig生成图像时尺寸不符合预期,且需保留透明效果的问题求助

使用Matplotlib savefig生成图像时尺寸不符合预期,且需保留透明效果的问题求助

大家好,我遇到了一个Matplotlib结合PIL处理图像时的问题,想向各位请教:

我用Matplotlib的savefig函数从图表生成图像,之后会用PIL对图像做进一步修改,同时希望完全移除所有内边距。但目前的问题是,最终生成的图像尺寸总是比预期的要小。举个例子:

  • 设置尺寸为(8, 10)
  • DPI设为300

按照计算,预期宽度应该是300*8=2400,但实际得到的宽度却是2310。

我试过添加plt.tight_layout(),效果比之前有所改善,但尺寸还是达不到预期值。我推测这是因为调用savefig之前,默认的pad_inches值是0.1,导致还有残留的内边距。

请问有没有办法让我得到尺寸完全符合预期的图像呢?

以下是我的代码示例:

from PIL import Image
import matplotlib.pyplot as plt
import io

SIZE_X = 8
SIZE_Y = 10
IMAGE_DPI = 300

fig, ax = plt.subplots(figsize=(SIZE_X, SIZE_Y), dpi=IMAGE_DPI)
ax.set_axis_off()
ax.plot([1, 2, 3, 4])

buffer = io.BytesIO()

plt.tight_layout()
plt.savefig(buffer, dpi=IMAGE_DPI, ax=ax, format='png', bbox_inches='tight', pad_inches=0, transparent=True)

buffer.seek(0)
image = Image.open(buffer)

print('Expected: ', (SIZE_X * IMAGE_DPI, SIZE_Y * IMAGE_DPI))
print('Figure size: ', (fig.get_figwidth() * fig.get_dpi(), fig.get_figheight() * fig.get_dpi()))
print('Image Size: ', image.size)

plt.close(fig)
del fig
del buffer

运行后的输出:

Expected: (2400, 3000)
Figure size: (2400.0, 3000.0)
Image Size: (2310, 2910)

另外补充一点:我试过下面这段代码能得到正确的图像尺寸,但没法实现透明效果:

image = Image.frombytes("RGBA", fig.canvas.get_width_height(), bytes(fig.canvas.get_renderer().buffer_rgba()))

备注:内容来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:44:11