Image.thumbnail - невозможно правильно изменить размер

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

class News(models.Model):
    title = models.CharField(verbose_name=u'tytuł', max_length=40)
    lead = models.TextField(verbose_name=u'zajawka', blank= False)
    body = models.TextField(verbose_name=u'treść ogłosznia', blank=False)
    author = models.ForeignKey(User)
    active = models.BooleanField(verbose_name=u'aktywność ogłoszenia')
    pub_date = models.DateTimeField(verbose_name=u'data publikacji')
    slug = models.SlugField(unique=True)
    lead_photo= models.ImageField(upload_to="lead_photo/")
    objects= NewsManager()

Я нашел на другом коде сайта и изменил его под свои нужды:

def save(self, force_update=False, force_insert=False, thumb_size=(120,120)):
    from PIL import Image
    from cStringIO import StringIO
    from django.core.files.uploadedfile import SimpleUploadedFile
    image = Image.open(self.lead_photo)

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

    image.thumbnail(thumb_size, Image.ANTIALIAS)

    # save the thumbnail to memory
    temp_handle = StringIO()
    image.save(temp_handle, 'JPEG')
    temp_handle.seek(0) # rewind the file

    # save to the thumbnail field
    suf = SimpleUploadedFile(os.path.split(self.lead_photo.name)[-1],
                             temp_handle.read(),
                             content_type='image/jpeg')
    self.lead_photo.save(suf.name+'.png', suf, save=False)

    # save the image object
    super(News, self).save(force_update, force_insert)

проблема в том, что я не могу создать миниатюру с разной шириной и высотой. Когда, например, задан размер thumb_size (240 320), я получу ту же пропорцию, что и в оригинале, но изображение будет меньше. Спасибо за советы.

Изменить: в документации PIL я нашел очень интересное предложение об этом методе: «Этот метод изменяет изображение, чтобы оно содержало миниатюрную версию самого себя, не превышающую заданный размер». Так есть ли возможность сделать именно такой размер?


person Max    schedule 17.02.2016    source источник


Ответы (2)


Вы можете попробовать resize< /а> метод.

И как вариант вы можете создать новое фоновое изображение (документ):

newImage = Image.new(resized.mode, resized.size, "black")

и поместите на него свое основное изображение, сохраняя пропорции, измененные на image.thumbnail(thumb_size, Image.ANTIALIAS).

person KravAn    schedule 17.02.2016

Вы можете использовать: http://djangothumbnails.com/

from django.db import models
from thumbs import ImageWithThumbsField

class Person(models.Model):
    photo = ImageWithThumbsField(upload_to='images', sizes=((125,125),(200,200)))

Не забудьте внутреннюю подушку

pip install pillow
person erajuan    schedule 18.02.2016