Как сделать так, чтобы PIL учитывал самую короткую сторону при создании эскиза? - PullRequest
1 голос
/ 01 декабря 2010

В настоящее время для моей функции ниже ... изображение будет изменено в зависимости от самой длинной стороны.

В основном изображение имеет большую высоту, высота будет 200 пикселей.Ширина будет просто ... что угодно ...

Если изображение имеет большую ширину, ширина будет 200px, и высота будет соответствующим образом скорректирована.

Как мне это перевернуть !?Я хочу, чтобы эта функция учитывала самую короткую сторону.

Я неправильно пишу эту функцию ??

def create_thumbnail(f, width=200, height=None, pad = False):
    #resizes the longest side!!! doesn't even care about the shortest side
    #this function maintains aspect ratio.
    if height==None: height=width
    im = Image.open(StringIO(f))
    imagex = int(im.size[0])
    imagey = int(im.size[1])
    if imagex < width or imagey < height:
        pass
        #return None
    if im.mode not in ('L', 'RGB', 'RGBA'):
        im = im.convert('RGB')
    im.thumbnail((width, height), Image.ANTIALIAS)
    thumbnail_file = StringIO()
    im.save(thumbnail_file, 'JPEG')
    thumbnail_file.seek(0)
    return thumbnail_file

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

Используйте resize вместо thumbnail.

Смысл thumbnail в том, чтобы упростить масштабирование изображения, чтобы оно соответствовало определенному ограничивающему прямоугольнику, сохраняя соотношение сторон.Это означает, что если ваша ограничительная рамка является квадратом, то более длинная сторона изображения определяет используемый масштаб.

resize дает вам более прямой контроль - вы точно указываете, какой размер вы хотите.

На самом деле, так как вы хотите сохранить аспект, вы все равно можете использовать миниатюру, но вам нужно пометить ограничивающую рамку.Перед звонком на thumbnail попробуйте сделать следующее:

old_aspect = float(imagex)/float(imagey)
new_aspect = float(width)/float(height)
if old_aspect < new_aspect:
  height = int(width / old_aspect)
else:
  width = int(height * old_aspect)
0 голосов
/ 01 декабря 2010

Я собрал эту функцию некоторое время назад:

def thumbnail(img, size=150):

    from math import floor
    from PIL import Image

    img = img.copy()

    if img.mode not in ('L', 'RGB'):
        img = img.convert('RGB')

    width, height = img.size

    if width == height:
        img.thumbnail((size, size), Image.ANTIALIAS)

    elif height > width:
        ratio = float(width) / float(height)
        newwidth = ratio * size
        img = img.resize((int(floor(newwidth)), size), Image.ANTIALIAS)

    elif width > height:
        ratio = float(height) / float(width)
        newheight = ratio * size
        img = img.resize((size, int(floor(newheight))), Image.ANTIALIAS)

    return img

image = thumbnail(image, size=600)

Уменьшает размер изображения до максимально возможного при сохранении самого длинного размера, сохраняя соотношение сторон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...