[英]django optimize, rename, resize image on first save
我想在保存時調整大小和優化圖像。 但是僅在圖像的第一次保存上,而不是在所有保存上。 另外,如果要上傳新文件,我想重命名文件並自動覆蓋舊文件。
目標是
下面是我到目前為止創建的代碼。
def get_upload_path(instance, filename):
name, ext = 'menu', os.path.splitext(filename)[1]
if instance.shopid: # shopid is defined by form view right before create()
return os.path.join("menues", instance.shopid + ext)
return os.path.join('menues', filename)
def scale_dimensions(width, height, longest_side):
if width > height:
if width > longest_side:
ratio = longest_side*1./width
return (int(width*ratio), int(height*ratio))
elif height > longest_side:
ratio = longest_side*1./height
return (int(width*ratio), int(height*ratio))
return (width, height)
from PIL import Image
import os
MAX_MENU_IMG_MB = 10.0
IMG_RESIZE_LONGEST_SIDE = 1400
class Shop(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
shopid = models.CharField(max_length=14, blank=True, editable=False)
name = models.CharField()
menu = models.ImageField(_("Photo (Max %sMB)") % str(MAX_MENU_IMG_MB), upload_to=get_upload_path, null=False, blank=False)
def save(self):
super(Shop, self).save()
if self.menu:
image = Image.open(self.menu.path)
(width, height) = image.size
(new_width, new_height) = scale_dimensions(width, height, longest_side=IMG_RESIZE_LONGEST_SIDE)
if new_width < width or new_height < height:
image = image.resize((new_width, new_height))
image.save("%s.jpg" % self.menu.path.split('.')[0], format='JPEG', quality=70, optimize=True)
使用init查看圖像變化
def __init__(self):
super(Shop, self).__init__(*args, **kwargs)
self.__previous_menu = self.menu if self.id else None
保存時,刪除以前的圖像和新圖像的原始版本
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
previous_menu = self.__previous_menu
if self.menu != previous_menu:
# delete old image if changed
if previous_menu:
os.remove('{}/{}'.format(
settings.MEDIA_ROOT,previous_menu.name).replace("\\","/"))
org_file = self.menu
# resize logic here
self.__previous_menu = self.menu # to avoid infinite loop
# remove original version of new image
os.remove('{}/{}'.format(
settings.MEDIA_ROOT,org_file.name).replace("\\","/"))
self.save()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.