PIL图像调整大小(resize)无法改变图片大小

48

我使用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的图像,但它没有对其进行调整大小。它对图片做了些什么,因为图片的大小从120 kb下降到20 kb,但尺寸保持不变。

也许你还可以提供一种用更少的代码裁剪成正方形图像的方法。我有点认为Image.thumbnail可以这样做,但它所做的是按照其宽度将我的图像缩放为150像素,高度为100像素。

3个回答

119

resize() 返回一个调整大小后的图像副本。它不会修改原始图像。正确的使用方法是:

from PIL import Image
#...

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

我认为你要找的是ImageOps.fit函数。根据PIL 文档

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

返回一个大小和裁剪的图像版本,将其裁剪到所请求的宽高比和大小。size参数是以像素为单位的请求输出大小,表示为(width,height)元组。

源链接


2
谢谢!就是这样。这又是我经常犯的愚蠢错误:P。再看一遍,我不明白为什么我自己没有理解它——毕竟它在该死的文档中。我想我需要去睡觉了。再次感谢,我会在其他日子尝试使用ImageOps.fit :D - Odif Yltsaeb
@Zayatzz,既然@Nadia的答案已经解决了你的问题,并且甚至提供了更好的方法建议,那就接受她的答案吧! - Alex Martelli
3
啊...那个奇怪的勾号....哦好吧。它可能需要一些东西来更吸引人的注意。 - Odif Yltsaeb

1

[更新] ANTIALIAS已经被弃用并将在Pillow 10(2023-07-01)中移除。请使用Resampling.LANCZOS代替。image.resize((100,100),Image.ANTIALIAS)


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()

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接