Как изменить размер источника с помощью sorl-thumbnail? - PullRequest
9 голосов
/ 20 февраля 2012

Я искал в Интернете свой вопрос и не смог найти четкого ответа ни на один пример.

По сути, я хочу использовать sorl и хочу изменить размер исходного изображения во время сохранения модели, чтобы изменить его размер до размера 640x480, чтобы в конечном итоге я не сохранил исходные файлы 2,5 МБ пользователя на диске. Затем я буду использовать шаблоны тегов для создания обычных миниатюр из моего источника, как описано в sorl.

Я натолкнулся на пару источников, ссылающихся на использование поля модели ThumbnailField, которое должно быть доступно в sorl.thumbnail.fields. Смотрите ссылку здесь . Однако в моей современной копии sorl из ствола я не вижу ни ThumbnailField, ни ImageWithThumbnailsField. Моя попытка импортировать его в модель проваливается соответственно. Я вижу, что эти ссылки старые, и мне интересно, смогу ли я достичь того же с помощью современного sorl.

С другой стороны, документация по sorl указывает только ImageField из sorl.thumbnail (см. здесь ), который не имеет аргумента размера для управления изменением размера источника.

Кстати, я вижу, что эта функциональность доступна с easy_thumbnail, который принимает входной параметр source_resize.

Любая помощь будет оценена!

РЕЗЮМЕ

Я принял приведенный ниже ответ, однако мне кажется, что естественная поддержка sorl для этого варианта использования может быть очень полезна - то есть добавление параметра resize_source в ImageField sorl, чтобы разрешить изменение размера исходного изображения. Ниже приведены два фактора, по которым это может быть полезно в данной области:

  1. Не хранить огромные оригинальные изображения пользователя, если оно не требуется для вашего приложения. Экономия дискового пространства.

  2. Не тратить лишний процессор на изменение размера миниатюр из этих огромных исходных изображений, если у вас нет особых причин высокого качества. Чтобы избежать этого, можно записывать вложенные теги в шаблоны в виде миниатюр из изображений меньшего размера, но это может очень быстро раздражать.

Ответы [ 3 ]

12 голосов
/ 03 октября 2012

Я нашел ошибку в приведенном выше коде, получил «str не имеет метода chunck ()», если кто-то захочет его использовать. Вот мое исправление:

    from sorl.thumbnail import get_thumbnail
    from django.core.files.base import ContentFile

 class Foo(models.Model):
    image = models.ImageField(upload_to...)


    def save(self, *args, **kwargs):
        if not self.id:  
            super(Foo, self).save(*args, **kwargs)  
            resized = get_thumbnail(self.image, "100x100" ...)
            self.image.save(resized.name, ContentFile(resized.read()), True)
        super(Foo, self).save(*args, **kwargs)
7 голосов
/ 20 февраля 2012

Sorl's ImageField, о котором вы упоминаете, - это просто обычный Django ImageField с дополнительным преимуществом управления удалением кэшированных миниатюр.Изменение размера при первоначальной загрузке не выполняется - это то, что вам нужно реализовать самостоятельно, используя представление, которое вы используете для загрузки. Документы показывают, как это сделать .Вы можете использовать sorl в в этом представлении, чтобы выполнить саму фактическую операцию изменения размера, используя низкоуровневый API-примеры

EDIT

Более быстрая альтернатива - просто изменить размер изображения при сохранении модели с помощью sorl.Вы можете сделать что-то вроде следующего (хотя и полностью не проверено!)

from sorl.thumbnail import get_thumbnail

class Foo(models.Model):
    image = models.ImageField(upload_to...)

    def save(self, *args, **kwargs):
        if not self.id:
            # Have to save the image (and imagefield) first
            super(Foo, self).save(*args, **kwargs)
            # obj is being created for the first time - resize
            resized = get_thumbnail(self.image, "100x100" ...)
            # Manually reassign the resized image to the image field
            self.image.save(resized.name, resized.read(), True)
        super(Foo, self).save(*args, **kwargs)

это будет означать, что у вас будет 2 версии одного и того же образа на диске - одна, где поле изображения django решит сохранить его (upload_to путь), а тот, в котором сохранено уменьшенное изображение, - уменьшенное изображение.Это, наряду с тем фактом, что изображение загружается и сохраняется дважды, являются недостатками этого подхода.Это быстрее реализовать, хотя

2 голосов
/ 12 сентября 2012

Я некоторое время искал решение и в конце концов написал приложение django-resized .

...