簡體   English   中英

django在首次保存時優化,重命名圖像並調整其大小

[英]django optimize, rename, resize image on first save

我想在保存時調整大小和優化圖像。 但是僅在圖像的第一次保存上,而不是在所有保存上。 另外,如果要上傳新文件,我想重命名文件並自動覆蓋舊文件。

目標是

  • 將圖像重命名為/ menues / {shopid} .jpg(也從png更改為jpg)
  • 優化網絡圖像
  • 如果圖像最大寬度/高度為1400,則重新調整寬度和高度

下面是我到目前為止創建的代碼。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM