如何使用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:])