Django上傳圖片生成縮圖
阿新 • • 發佈:2019-02-12
上傳圖片時,有些較大的圖片如果不經壓縮就在前臺展示,就會造成頁面重新整理速度慢、流量浪費等情況,所以我們在上傳圖片時可以生成該圖片的縮圖。
需求:在上傳圖片的同時,生成圖片的縮圖儲存到伺服器,並將縮圖地址儲存到伺服器
先寫一個生成縮圖的方法:
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()
然後儲存圖片,檢視資料庫,發現縮圖已經儲存進去了: