Есть ли очевидный способ сделать это, что мне не хватает? Я просто пытаюсь сделать эскизы.Как изменить размер изображения с помощью PIL и сохранить его соотношение сторон?
ответ
Определите максимальный размер. Затем вычислите коэффициент изменения размера, взяв min(maxwidth/width, maxheight/height)
.
Правильный размер oldsize*ratio
.
Существует, конечно, также библиотечный метод для этого: метод Image.thumbnail
.
Ниже приведен пример (0) из 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
** Комментарий от [Randy Syring] (http://stackoverflow.com/users/182111/randy-syring) **: Добавьте `Image.ANTIALIAS` к вызову` thumbnail() `. Это настоятельно рекомендуется в документах, и при этом это лучший ответ, следует придерживаться наилучшей практики. Другими словами: Замените `im.thumbnail (size)` на `im.thumbnail (size, Image.ANTIALIAS)`. – Anne 2011-12-07 21:50:40
Как говорится, пример был из документации пилота, и этот пример (все еще) не использует флаг antialias. Так как это, вероятно, большинство людей захочет, я добавил. – gnud 2011-12-08 08:29:50
PIL задает высоту нового изображения с заданным размером (128 здесь) и вычисляет ширину, чтобы сохранить соотношение сторон. Есть ли способ исправить ширину вместо высоты? возможно, я задам это по отдельному вопросу. – eugene 2012-12-13 08:22:32
Если вы пытаетесь сохранить одинаковое соотношение сторон, то разве вы не измените размер на определенный процент от первоначального размера?
Например, половина размер оригинала
half = 0.5
out = im.resize([int(half * s) for s in im.size])
Этот сценарий будет изменить размер изображения (somepic.jpg) с помощью PIL (Python Imaging Library) с шириной 300 пикселей и высотой, пропорциональной новой ширине , Он делает это, определяя, какой процент 300 пикселей имеет исходную ширину (img.size [0]), а затем умножает исходную высоту (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, потому что он удаляет из вас все отношения.
Один важный намек, хотя: Заменить
im.thumbnail(size)
с
im.thumbnail(size,Image.ANTIALIAS)
по умолчанию, PIL использует Image.NEAREST фильтр для изменения размера, что приводит к хорошей производительности, но низкого качества.
PIL уже имеет возможность обрезать изображение
img = ImageOps.fit(img, size, Image.ANTIALIAS)
Мой уродливый пример.
Функция получает файл типа: "pic [0-9a-z]. [Extension]", изменяет размер до 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:])
Основанная в @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)
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
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
Поскольку этот вопрос довольно старый, но полезный, и подушку, а предпочтительным для подушек на основе учебника, посмотрите на это: HTTP : //pillow.readthedocs.org/en/latest/handbook/tutorial.html#create-jpeg-thumbnails – Wtower 2015-03-26 10:27:53
Я создал небольшую библиотеку для изменения размера изображений, это может быть любая помощь: https://github.com/ charlesthk/python-resize-image – Charlesthk 2015-04-28 14:49:12