2008-11-07 2 views
266

Есть ли очевидный способ сделать это, что мне не хватает? Я просто пытаюсь сделать эскизы.Как изменить размер изображения с помощью PIL и сохранить его соотношение сторон?

+7

Поскольку этот вопрос довольно старый, но полезный, и подушку, а предпочтительным для подушек на основе учебника, посмотрите на это: HTTP : //pillow.readthedocs.org/en/latest/handbook/tutorial.html#create-jpeg-thumbnails – Wtower 2015-03-26 10:27:53

+1

Я создал небольшую библиотеку для изменения размера изображений, это может быть любая помощь: https://github.com/ charlesthk/python-resize-image – Charlesthk 2015-04-28 14:49:12

ответ

326

Определите максимальный размер. Затем вычислите коэффициент изменения размера, взяв 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 
+58

** Комментарий от [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

+2

Как говорится, пример был из документации пилота, и этот пример (все еще) не использует флаг antialias. Так как это, вероятно, большинство людей захочет, я добавил. – gnud 2011-12-08 08:29:50

+2

PIL задает высоту нового изображения с заданным размером (128 здесь) и вычисляет ширину, чтобы сохранить соотношение сторон. Есть ли способ исправить ширину вместо высоты? возможно, я задам это по отдельному вопросу. – eugene 2012-12-13 08:22:32

9

Если вы пытаетесь сохранить одинаковое соотношение сторон, то разве вы не измените размер на определенный процент от первоначального размера?

Например, половина размер оригинала

half = 0.5 
out = im.resize([int(half * s) for s in im.size]) 
136

Этот сценарий будет изменить размер изображения (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') 
46

Я также рекомендую использовать метод миниатюр PIL, потому что он удаляет из вас все отношения.

Один важный намек, хотя: Заменить

im.thumbnail(size) 

с

im.thumbnail(size,Image.ANTIALIAS) 

по умолчанию, PIL использует Image.NEAREST фильтр для изменения размера, что приводит к хорошей производительности, но низкого качества.

13

PIL уже имеет возможность обрезать изображение

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

Мой уродливый пример.

Функция получает файл типа: "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:]) 
17

Основанная в @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) 
2
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 
8
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 

 Смежные вопросы

  • Нет связанных вопросов^_^