Почему пиктограмма PIL не изменяется должным образом? - PullRequest
5 голосов
/ 30 мая 2011

Я пытаюсь создать и сохранить уменьшенное изображение при сохранении исходного изображения пользователя в модели userProfile в моем проекте, ниже мой код:

def save(self, *args, **kwargs):
    super(UserProfile, self).save(*args, **kwargs)
    THUMB_SIZE = 45, 45
    image = Image.open(join(MEDIA_ROOT, self.headshot.name))

    fn, ext = os.path.splitext(self.headshot.name)
    image.thumbnail(THUMB_SIZE, Image.ANTIALIAS)        
    thumb_fn = fn + '-thumb' + ext
    tf = NamedTemporaryFile()
    image.save(tf.name, 'JPEG')
    self.headshot_thumb.save(thumb_fn, File(open(tf.name)), save=False)
    tf.close()

    super(UserProfile, self).save(*args, **kwargs)

Все работает нормально, только эта вещь.

Проблема в том, что функция миниатюр устанавливает только ширину 45 и не меняет аспект изображения, поэтому я получаю изображение 45*35 для того, на котором я тестирую (короткое изображение ).

Может кто-нибудь сказать мне, что я делаю не так? Как заставить соотношение сторон, которое я хочу?

P.S .: Я перепробовал все методы для размера: tupal: THUMB_SIZE = (45, 45) и ввод размеров непосредственно в функцию миниатюр.

Еще один вопрос: в чем разница между функциями изменения размера и миниатюры в PIL? Когда использовать изменение размера, а когда использовать миниатюру?

Ответы [ 2 ]

12 голосов
/ 30 мая 2011

Функция image.thumbnail () будет поддерживать пропорции исходного изображения.

Использовать image.resize () вместо.

ОБНОВЛЕНИЕ

image = image.resize(THUMB_SIZE, Image.ANTIALIAS)        
thumb_fn = fn + '-thumb' + ext
tf = NamedTemporaryFile()
image.save(tf.name, 'JPEG')
4 голосов
/ 31 мая 2011

Дано:

import Image # Python Imaging Library
THUMB_SIZE= 45, 45
image # your input image

Если вы хотите изменить размер любого изображения до размера 45 × 45, вам следует использовать:

new_image= image.resize(THUMB_SIZE, Image.ANTIALIAS)

Однако, если вы хотите получить результирующее изображение размера45 × 45 при изменении размера входного изображения, сохраняя его пропорции и заполняя недостающие пиксели черным:

new_image= Image.new(image.mode, THUMB_SIZE)
image.thumbnail(THUMB_SIZE, Image.ANTIALIAS) # in-place
x_offset= (new_image.size[0] - image.size[0]) // 2
y_offset= (new_image.size[1] - image.size[1]) // 2
new_image.paste(image, (x_offset, y_offset))
...