2016-02-17 42 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) 

的问题是,我不能创建缩略图不同宽度和高度比例。例如,当设置thumb_size(240,320)时,我会得到与oryginal相同的比例,但图片较小。感谢您的建议。

编辑: 在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