如何使用PIL调整图像大小并保持宽高比?
我是不是漏掉了什么简单的方法?我只是想制作缩略图。
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