首页 > 解决方案 > 如何在将 ImageField 图像保存在 python Django 模型中之前调整其大小

问题描述

我正在尝试实现一个 Django ImageField 类函数来调整图像大小但是我不确定这个函数在哪里接受我的新图像尺寸

在 Linux 和 Python 3.7 上运行

我看过这个文档,但不太明白: https ://docs.djangoproject.com/en/1.11/_modules/django/db/models/fields/files/#ImageField

如果有人可以向我展示如何使用此功能的示例,我将不胜感激。

编辑

我还没有成功地调整我的图像尺寸,这就是我想要实现的。鉴于它正在被获取,我如何在保存它之前调整它的大小ImageField(我找到了update_dimensions_fields类函数ImageField但是我不知道如何使用它)

class Posts(models.Model):
    title = models.CharField(max_length=200, blank=True)
    body = models.TextField(blank=True)
    created_at = models.DateTimeField(default=datetime.datetime.now)
    post_image = models.ImageField(upload_to=get_image_path, blank=True, null=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        # I would like to use the function beneath to resize my images before I save them to my database
        self.post_image.update_dimension_fields(self, instance, force=False, *args, **kwargs)

        super().save(*args, **kwargs) # Call the "real" save() method.

    class Meta:
        verbose_name_plural = "Posts"

标签: pythondjango

解决方案


您可以使用django-resized库。它会在上传时调整图像大小并为您存储它们。

用法

from django_resized import ResizedImageField

class Posts(models.Model):
    title = models.CharField(max_length=200, blank=True)
    body = models.TextField(blank=True)
    created_at = models.DateTimeField(default=datetime.datetime.now)
    post_image = ResizedImageField(size=[500, 300], upload_to=get_image_path, blank=True, null=True)

    def __str__(self):
        return self.title

选项

  • size - 最大宽度和高度,例如 [640, 480]
  • 裁剪- 调整大小和裁剪。['top', 'left'] - 左上角,['middle', - 'center'] 是中心裁剪,['bottom', 'right'] - 裁剪右下角。
  • 质量- 调整大小图像的质量 1..100
  • keep_meta - 保留 EXIF 和其他元数据,默认 True
  • force_format - 强制调整后图像的格式,可用的格式是枕头支持的格式,默认为无

推荐阅读