在 Django 中使用 Pillow 压缩图像

HuL*_*iCa 6 python django django-models python-imaging-library django-rest-framework

我有一个 Django 项目,我使用 Pillow 在某些模型中存储图像,但我希望这些图像被压缩存储。当图像保存到模型ImageField时,如何指示 Pillow 压缩图像时,如何指示 Pillow 压缩图像?

这是带有ImageField的模型示例:

class Photo(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Name"))
    album = models.ForeignKey(Album, on_delete=models.PROTECT, related_name='photos', verbose_name=_("Album"))
    photo = models.ImageField(verbose_name=_("Photo"))

    class Meta:
        verbose_name = _("Photo")
        verbose_name_plural =_("Photos")

    def __str__(self):
        return "[{}] {}".format(self.pk, self.name)
Run Code Online (Sandbox Code Playgroud)

我可以看到存储后的文件,并且可以看到它的大小与原始源文件相同。

我正在使用Django Rest Framework从前端获取图像。

rud*_*dra 8

您可以覆盖save模型的方法:

from PIL import Image

class Photo(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Name"))
    album = models.ForeignKey(Album, on_delete=models.PROTECT, related_name='photos', verbose_name=_("Album"))
    photo = models.ImageField(verbose_name=_("Photo"))

    def save(self, *args, **kwargs):
       instance = super(Photo, self).save(*args, **kwargs)
       image = Image.open(instance.photo.path)
       image.save(instance.photo.path,quality=20,optimize=True)
       return instance
Run Code Online (Sandbox Code Playgroud)