Сжатие изображений с подушкой в ​​Джанго - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть проект с Django, и я использую Pillow для хранения изображений в некоторых моделях, но я хочу, чтобы эти изображения сохранялись в сжатом виде.Как я могу дать Pillow команду сжимать изображения, когда они сохраняются в модели ImageField ?

Это пример модели с 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)

Я вижу файл после сохранения и вижу, что он имеет тот же размер, что и исходный файл.

Я использую Django Rest Framework для получения изображенийот внешнего интерфейса.

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете переопределить 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
...