1. 程式人生 > >Django上傳圖片生成縮圖

Django上傳圖片生成縮圖

上傳圖片時,有些較大的圖片如果不經壓縮就在前臺展示,就會造成頁面重新整理速度慢、流量浪費等情況,所以我們在上傳圖片時可以生成該圖片的縮圖。

需求:在上傳圖片的同時,生成圖片的縮圖儲存到伺服器,並將縮圖地址儲存到伺服器

先寫一個生成縮圖的方法:

from PIL import Image
def make_thumb(path,size=150):  #指定size,在這裡表示圖片的高度
    pixbuf = Image.open(path)
    width, height = pixbuf.size

    if height > size:  #如果高度大於150,則進行壓縮
        delta = height / size
        width = int(width / delta)
        pixbuf.thumbnail((width, height), Image.ANTIALIAS)
        return pixbuf

    然後編寫models.py,重寫儲存圖片時的sava方法。(ArticleImage與MiniArticle是多對一的關係)

import os
from django.db import models
from django.db.models.fields.files import ImageFieldFile
from mzz.settings import MEDIA_ROOT

class ArticleImage(models.Model):
    image=models.ImageField('插入圖片',upload_to='article_img')  # 原圖
    mini_article=models.ForeignKey(MiniArticle)  # 外來鍵約束

    thumb=models.ImageField('縮圖',upload_to='thumb_img',blank=True,null=True)  # 縮圖

    def save(self):  #重寫圖片儲存方法
        super(ArticleImage, self).save()
        img_name=self.image.name.split('/')[1]
        thumb_pixbuf = make_thumb(os.path.join(MEDIA_ROOT,'article_img/'+img_name))
        thumb_path = os.path.join(MEDIA_ROOT,'thumb_img/'+img_name)
        thumb_pixbuf.save(thumb_path)
        self.thumb = ImageFieldFile(self, self.thumb, 'thumb_img/'+img_name)
        super(ArticleImage, self).save()

    然後儲存圖片,檢視資料庫,發現縮圖已經儲存進去了: