2016-02-17 6 views
0

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

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) 

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

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

ответ

0

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

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

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

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

0

Вы можете использовать: 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))) 

Не забудьте intall Подушка

pip install pillow 
Смежные вопросы