9

私は自分の質問をウェブで検索していましたが、明確な回答や例が見つかりませんでした。

基本的に、私は sorl を使用し、モデルの保存時間中にソース イメージのサイズを変更して 640x480 サイズに縮小したいので、ユーザーの元の 2.5 MB ファイルをディスクに保存することはありません。次に、テンプレートタグを使用して、sorl に記載されているように、ソースから通常のサムネイルを作成します。

私は、sorl.thumbnail.fields で利用できるはずの ThumbnailField モデル フィールドを使用することを参照しているいくつかのソースに出くわしました。こちらのリンクを参照してください。ただし、トランクからの最新の sorl コピーには、ThumbnailField または ImageWithThumbnailsField が表示されません。それに応じてモデルにインポートしようとしても失敗します。これらの参照は古いものですが、最新の sorl で同じことを達成できるかどうか疑問に思っています。

一方、sorl のドキュメントは、ソースのサイズ変更を制御するサイズ引数を持たないsorl.thumbnail (こちらを参照) の ImageField のみを示しています。

ところで、この機能は、入力パラメーター source_resize を受け取る easy_thumbnail で利用できることがわかりました。

どんな助けでも大歓迎です!

まとめ

以下の回答を受け入れましたが、このユースケースに対する自然な sorl サポートは非​​常に役立つと思います。つまり、resize_source パラメータを sorl の ImageField に追加して、ソース画像のサイズを変更できるようにします。以下に、これが現場で役立つ 2 つの要因を示します。

  1. アプリで必要がない場合は、ユーザーの巨大な元の画像を保存しないでください。ディスク容量の節約。

  2. 特定の極端な高品質の理由がない場合は、その巨大なソース画像からサムネイルのサイズを変更するために余分な CPU を費やさないでください。これを避けるために、テンプレートにネストされたタグを小さなサイズの画像からサムネイルに書き込むことができますが、すぐに面倒になる可能性があります.

4

4 に答える 4

12

上記のコードに欠陥が見つかりました。誰かがそれを使用したい場合は、「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)
于 2012-10-02T23:38:29.910 に答える
8

あなたが言及したSorlは、キャッシュされたサムネイルの削除を管理するという追加の利点を備えたImageField単なる通常のDjangoです。ImageField最初のアップロードではサイズ変更は行われません。これは、アップロードに使用しているビューを介して手動で実装する必要があるものです。ドキュメントには、これについての方法が示されています低レベル APIの例を使用してそのビューでsorl を使用して、実際のサイズ変更操作自体を実行できます。

編集

より迅速な代替手段は、モデルが 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 つのバージョンがあることを意味します。1 つは django 画像フィールドが保存することを決定した場所 (upload_toパス) で、もう 1 つは sorl サムネイルがサイズ変更されたサムネイルを保存した場所です。これは、画像のアップロードと保存が 2 回行われるという事実とともに、このアプローチの欠点です。実装は早いけど

于 2012-02-19T23:29:22.627 に答える
2

私はしばらくの間解決策を探していましたが、最終的に app django-resized を書きました。

于 2012-09-12T05:29:03.960 に答える