如何使用PIL调整图像大小并保持宽高比?

637 投票
25 回答
1153047 浏览
提问于 2025-04-11 21:06

我是不是漏掉了什么简单的方法?我只是想制作缩略图。

25 个回答

91

我也建议使用PIL的缩略图方法,因为这样可以省去你很多关于比例的麻烦。

不过,有一个重要的提示:把

im.thumbnail(size)

替换成

im.thumbnail(size,Image.ANTIALIAS)

。默认情况下,PIL在调整大小时使用的是Image.NEAREST这个过滤器,这样做虽然速度快,但图像质量不太好。

402

这个脚本会使用PIL(Python图像库)来调整一张图片(somepic.jpg)的大小,把它的宽度改成300像素,同时保持高度的比例。它的做法是先计算出300像素占原始宽度img.size[0]的百分比,然后用这个百分比去乘以原始高度img.size[1]。如果你想改变图片的默认宽度,可以把base_width改成其他数字。

from PIL import Image

base_width= 300
img = Image.open('somepic.jpg')
wpercent = (base_width / float(img.size[0]))
hsize = int((float(img.size[1]) * float(wpercent)))
img = img.resize((basewidth, hsize), Image.Resampling.LANCZOS)
img.save('somepic.jpg')
624

首先,定义一个最大尺寸。

接着,通过计算一个缩放比例来调整大小,这个比例的计算方式是用 min(maxwidth/width, maxheight/height)

最终的合适尺寸就是 oldsize*ratio

当然,还有一个库的方法可以做到这一点,那就是 Image.thumbnail 方法。
下面是来自 PIL 文档 的一个(经过编辑的)示例。

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size, Image.Resampling.LANCZOS)
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for '%s'" % infile

撰写回答