Вы можете использовать сигнал thumbnail_created
и вызывать внешнее приложение через subporecess.Popen
.Я просто осознаю это в своем проекте.Вы даже можете оптимизировать изображения, когда они загружены, используя сигнал saved_file
!
Вот мой код:
import subprocess
from os.path import splitext
from django.dispatch import receiver
from easy_thumbnails.signals import saved_file, thumbnail_created
@receiver(saved_file)
def optimize_file(sender, fieldfile, **kwargs):
optimize(fieldfile.path)
@receiver(thumbnail_created)
def optimize_thumbnail(sender, **kwargs):
optimize(sender.path)
def optimize(path):
runString = {
".jpeg": u"jpegoptim -f --strip-all '%(file)s'",
".jpg": u"jpegoptim -f --strip-all '%(file)s'",
".png": u"optipng -force -o7 '%(file)s' && advpng -z4 '%(file)s' && pngcrush -rem gAMA -rem alla -rem cHRM -rem iCCP -rem sRGB -rem time '%(file)s' '%(file)s.bak' && mv '%(file)s.bak' '%(file)s'"
}
ext = splitext(path)[1].lower()
if ext in runString:
subprocess.Popen(runString[ext] % {'file': path}, shell=True)
runString
взят из trimage .В Debian вам необходимо установить следующие пакеты: jpegoptim optipng pngcrush advancecomp
.Или просто используйте другие инструменты, такие как smush.py
.
Я также нашел этот проект , который инкапсулирует код выше, имеет поддержку gif и лучшее распознавание типов файлов.