11 ответов:
определите максимальный размер. Затем вычислите коэффициент изменения размера, взяв
min(maxwidth/width, maxheight/height).правильный размер
oldsize*ratio.есть, конечно, и библиотечный метод для этого: метод
Image.thumbnail.
Ниже приведен (отредактированный) пример из PIL documentation.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
этот скрипт изменит размер изображения (somepic.jpg) с использованием Pil (Python Imaging Library) до ширины 300 пикселей и высоты, пропорциональной новой ширине. Он делает это, определяя, какой процент 300 пикселей имеет исходную ширину (img.размер[0]), а затем умножение исходной высоты (img.размер[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, потому что он удаляет все проблемы с отношением от вас.
один важный намек, хотя: заменить
im.thumbnail(size)С
im.thumbnail(size,Image.ANTIALIAS)по умолчанию PIL использует изображение.Ближайший фильтр для изменения размера, что приводит к хорошей производительности, но низкое качество.
основанный в @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)
Если вы пытаетесь сохранить то же соотношение сторон, то не изменяется на определенный процент от исходного размера?
например, половина исходного размера
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].[расширение]", измените их размер до 120x120, переместите раздел в центр и сохраните в " 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:])
просто обновите этот вопрос с помощью более современной оболочки Эта библиотека обертывает подушку (вилка пил) https://pypi.org/project/python-resize-image/
позволяет сделать что-то подобное :-
from PIL import Image from resizeimage import resizeimage fd_img = open('test-image.jpeg', 'r') img = Image.open(fd_img) img = resizeimage.resize_width(img, 200) img.save('test-image-width.jpeg', img.format) fd_img.close()куча других примеров в приведенной выше ссылке.
простой метод для сохранения ограниченных отношений и передачи максимальной ширины / высоты. Не самый красивый, но получает работу и легко понять:
def resize(img_path, max_px_size, output_folder): with Image.open(img_path) as img: width_0, height_0 = img.size out_f_name = os.path.split(img_path)[-1] out_f_path = os.path.join(output_folder, out_f_name) if max((width_0, height_0)) <= max_px_size: print('writing {} to disk (no change from original)'.format(out_f_path)) img.save(out_f_path) return if width_0 > height_0: wpercent = max_px_size / float(width_0) hsize = int(float(height_0) * float(wpercent)) img = img.resize((max_px_size, hsize), Image.ANTIALIAS) print('writing {} to disk'.format(out_f_path)) img.save(out_f_path) return if width_0 < height_0: hpercent = max_px_size / float(height_0) wsize = int(float(width_0) * float(hpercent)) img = img.resize((max_px_size, wsize), Image.ANTIALIAS) print('writing {} to disk'.format(out_f_path)) img.save(out_f_path) returnздесь python script, который использует эту функцию для запуска пакетного изменения размеров изображения.
Comments