PIL Image.resize() 不改变图片大小

48 投票
3 回答
75966 浏览
提问于 2025-04-15 13:29

我遇到了一个奇怪的问题,使用PIL库的时候,图片没有被调整大小。

from PIL import Image
img = Image.open('foo.jpg')

width, height = img.size
ratio = floor(height / width)
newheight = ratio * 150

img.resize((150, newheight), Image.ANTIALIAS)

img.save('mugshotv2.jpg', format='JPEG')

这段代码运行没有任何错误,并且在正确的文件夹里生成了一个名为 mugshotv2.jpg 的图片,但它并没有改变图片的大小。虽然图片的文件大小从120KB降到了20KB,但图片的尺寸却没有变化。

也许你们可以建议一种用更少代码裁剪图片成正方形的方法。我原以为 Image.thumbnail 可以做到这一点,但它实际上是把我的图片宽度缩放到150像素,而高度却只留了100像素。

3 个回答

0

今天你应该使用类似这样的代码:

from PIL import Image

img = Image.open(r"C:\test.png")
img.show()
img_resized = img.resize((100, 100), Image.Resampling.LANCZOS)
img_resized.show()
1

[更新] ANTIALIAS这个选项已经被淘汰,并将在Pillow 10版本中被移除(2023年7月1日)。请改用Resampling.LANCZOS来替代。比如,原来的代码image.resize((100,100),Image.ANTIALIAS)需要修改。

118

resize() 函数会返回一张调整大小后的图片副本。它不会改变原来的图片。正确的使用方法是:

from PIL import Image
#...

img = img.resize((150, newheight), Image.ANTIALIAS)

来源

我觉得你想要的功能是 ImageOps.fit 函数。根据 PIL 的 文档

ImageOps.fit(image, size, method, bleed, centering) => image

这个函数会返回一张经过调整大小和裁剪的图片,裁剪到你要求的宽高比和大小。size 参数是你想要的输出大小,以像素为单位,格式是 (宽度, 高度) 的元组。

撰写回答