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

有没有一种明显的方式来做到这一点,我失踪了? 我只是想缩略图。

定义最大尺寸。 然后,通过取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.ANTIALIAS) im.save(outfile, "JPEG") except IOError: print "cannot create thumbnail for '%s'" % infile 

该脚本将使用PIL(Python Imaging Library)将图像大小调整为300像素,高度与新宽度成比例。 它通过确定原始宽度(img.size [0])的百分比为300像素,然后将原始高度(img.size [1])乘以该百分比来实现。 将“basewidth”更改为任何其他数字,以更改图像的默认宽度。

 from PIL import Image basewidth = 300 img = Image.open('somepic.jpg') wpercent = (basewidth/float(img.size[0])) hsize = int((float(img.size[1])*float(wpercent))) img = img.resize((basewidth,hsize), Image.ANTIALIAS) img.save('sompic.jpg') 

我也推荐使用PIL的缩略图方法,因为它可以消除所有的比例麻烦。

一个重要的提示,但:replace

 im.thumbnail(size) 

 im.thumbnail(size,Image.ANTIALIAS) 

默认情况下,PIL使用Image.NEARESTfilter进行大小调整,从而获得良好的性能,但质量差。

基于@tomvon,我完成了以下使用:

调整宽度大小:

 new_width = 680 new_height = new_width * height / width 

调整高度:

 new_height = 680 new_width = new_height * width / height 

然后只是:

 img = img.resize((new_width, new_height), Image.ANTIALIAS) 

PIL已经可以select裁剪图像

 img = ImageOps.fit(img, size, Image.ANTIALIAS) 

如果您试图保持相同的长宽比,那么您是不是将原尺寸的某个百分比resize?

例如,原始大小的一半

 half = 0.5 out = im.resize( [int(half * s) for s in im.size] ) 
 from PIL import Image img = Image.open('/your iamge path/image.jpg') # image extension *.png,*.jpg new_width = 200 new_height = 300 img = img.resize((new_width, new_height), Image.ANTIALIAS) img.save('output image name.png') # format may what u want ,*.png,*jpg,*.gif 
 from PIL import Image from resizeimage import resizeimage def resize_file(in_file, out_file, size): with open(in_file) as fd: image = resizeimage.resize_thumbnail(Image.open(fd), size) image.save(out_file) image.close() resize_file('foo.tif', 'foo_small.jpg', (256, 256)) 

我使用这个库:

 pip install python-resize-image 

我丑陋的例子。

函数获取如下文件:“pic [0-9a-z]。[扩展名]”,将其大小调整为120×120,移动部分居中并保存到“ico [0-9a-z]。[扩展名]”,和风景:

 def imageResize(filepath): from PIL import Image file_dir=os.path.split(filepath) img = Image.open(filepath) if img.size[0] > img.size[1]: aspect = img.size[1]/120 new_size = (img.size[0]/aspect, 120) else: aspect = img.size[0]/120 new_size = (120, img.size[1]/aspect) img.resize(new_size).save(file_dir[0]+'/ico'+file_dir[1][3:]) img = Image.open(file_dir[0]+'/ico'+file_dir[1][3:]) if img.size[0] > img.size[1]: new_img = img.crop( ( (((img.size[0])-120)/2), 0, 120+(((img.size[0])-120)/2), 120 ) ) else: new_img = img.crop( ( 0, (((img.size[1])-120)/2), 120, 120+(((img.size[1])-120)/2) ) ) new_img.save(file_dir[0]+'/ico'+file_dir[1][3:])