如何在django模型中使用PIL

时间:2011-03-23 07:10:31

标签: django model resize python-imaging-library imagefield

我喜欢在最终存储之前调整上传图像(ImageField)的大小,我听说python有一个名为PIL的图像库,我想用它做那个任务,但我不知道如何开始。

有关如何操作的任何建议吗?

由于

2 个答案:

答案 0 :(得分:0)

您可以覆盖模型的保存功能,您可以在其中打开文件并调整其大小(不推荐,因为每次保存模型时都会调整大小),文件上传后调整大小(例如在form.save()之前/期间)

但恕我直言,更好的解决方案是使用专用的应用程序,我最喜欢的是sorl-thumbnails

答案 1 :(得分:0)

我刚刚发现了如何做到但是有没有办法简化它?我是python和django的新手,所以我不确定这是否是正确的方法。

下面是我的代码:

from django.db.models.signals import pre_delete, pre_save

def on_save_image(sender, **kwargs):
    import PIL
    obj = kwargs['instance']
    if obj.file:
        try:
            original = sender.objects.get(pk = obj.pk)
            if original.file:
                #if change image then delete original file
                original.file.delete()
        except ObjectDoesNotExist:
            pass
        finally:
            img = PIL.Image.open(obj.file)
            img.thumbnail((500, 500))
            # reset pointer to start at 0 again
            obj.file.open()
            img.save(obj.file)
pre_save.connect(on_save_image, sender = Image)

# delete file in memory
def on_delete_image(sender, **kwargs):
    obj = kwargs['instance']
    if obj.file:
        obj.file.delete()
pre_delete.connect(on_delete_image, sender = Image)

由于