PIL Image.resize() 不改变图片大小
我遇到了一个奇怪的问题,使用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 参数是你想要的输出大小,以像素为单位,格式是 (宽度, 高度) 的元组。