13

私はDjango(およびPython)を初めて使用し、他の人のアプリを使用する前に、自分でいくつかのことを解決しようとしました. Django (または Python) のやり方のどこに「適合」するかを理解するのに苦労しています。私が解決しようとしているのは、アップロードされた画像のサイズを変更する方法です。モデルを適切にセットアップして管理者に接続すると、画像がディレクトリに正常にアップロードされます。

from django.db import models

# This is to list all the countries
# For starters though, this will be just United Kingdom (GB)
class Country(models.Model):
    name = models.CharField(max_length=120, help_text="Full name of country")
    code = models.CharField(max_length=2, help_text="This is the ISO 3166 2-letter country code (see: http://www.theodora.com/country_digraphs.html)")
    flag = models.ImageField(upload_to="images/uploaded/country/", max_length=150, help_text="The flag image of the country.", blank=True)

    class Meta:
        verbose_name_plural = "Countries"

    def __unicode__(self):
        return self.name

私が今問題を抱えているのは、そのファイルを取得して、新しいファイルをサムネイルにすることです。私が言うように、他のアプリを使用せずにそれを行う方法を知りたいです (今のところ)。DjangoSnippets からこのコードを取得しました。

from PIL import Image
import os.path
import StringIO

def thumbnail(filename, size=(50, 50), output_filename=None):
    image = Image.open(filename)
    if image.mode not in ('L', 'RGB'):
        image = image.convert('RGB')
    image = image.resize(size, Image.ANTIALIAS)

    # get the thumbnail data in memory.
    if not output_filename:
        output_filename = get_default_thumbnail_filename(filename)
    image.save(output_filename, image.format) 
    return output_filename

def thumbnail_string(buf, size=(50, 50)):
    f = StringIO.StringIO(buf)
    image = Image.open(f)
    if image.mode not in ('L', 'RGB'):
        image = image.convert('RGB')
    image = image.resize(size, Image.ANTIALIAS)
    o = StringIO.StringIO()
    image.save(o, "JPEG")
    return o.getvalue()

def get_default_thumbnail_filename(filename):
    path, ext = os.path.splitext(filename)
    return path + '.thumb.jpg'

...しかし、これは最終的に私を混乱させました...これが私のDjangoアプリにどのように「適合」するかわからないので? 本当に、正常にアップロードされた画像のサムネイルを作成するのに最適なソリューションですか? 私のような初心者がこれを適切に行うことを学ぶことができる、しっかりとした適切な方法を教えてくれる人はいますか? のように、そのようなコード (models.py? forms.py? ...) を配置する場所と、それがコンテキストでどのように機能するかを知っていますか? ... この問題を理解し、解決するために少しだけ助けが必要です。

ありがとうございました!

4

12 に答える 12

2

あなたは試してみることができます:

画像ヘッドカット

特徴:

  • 画像の注目の中心を設定できます...頭が切れなくなります。
  • ビデオサムネイル
  • サイト間の画像リンクを防止します
  • 簡単なセットアップと使用法
于 2011-06-12T10:49:44.207 に答える
2

save メソッドをオーバーライドするのも良い方法ですが、この場合はシグナルを使用したくなるでしょう。Django シグナルを使用すると、特定のモデル タイプのさまざまなイベントを「聞く」ことができます。この場合、あなたはそのpost_saveイベントに興味があるでしょう。

私は通常、自分のmodels.pyファイルでそのようなシグナルをサブスクライブします。コードは次のようになります。

from django.db.models.signals import post_save
from models import Country

def resize_image(sender, **kwargs):
    country = kwargs["instance"]
    resize_image(country.flag) # where resize_image generates a thumbnail given a Country instance

post_save.connect(resize_image, sender=Country)
于 2009-07-22T14:03:32.433 に答える
2

重要な質問は、いつサムネイルを生成する必要があるかということです。

  1. ユーザーがサムネイル画像を要求したときに動的に?
  2. または、国がデータベースに INSERTed/UPDATEd されるたびに、物理ディスク ファイルを作成しますか。

(1) url にマップするビューを作成することをお勧めします/flagthumbnail/countryid。ビュー メソッドは次のようにする必要があります。

  1. データベースから国のインスタンスを取得する
  2. フラグ イメージを PIL イメージに読み込み、サイズを変更します。
  3. 正しい content-type で HTTPResponse を作成 (および返し) し、PIL イメージを応答に書き込みます。

サムネイル フラグを表示する必要があるときはいつでも、 を使用して<a href="/flagthumbnail/countryid">ください。

(2) の場合、Django のdjango.db.models.signals.post_saveシグナルに接続し、シグナル ハンドラでサムネイル ファイルを作成して保存できます。

于 2009-07-22T12:51:25.703 に答える
2

サムネイルをいつどのように使用するかによって異なります。

国が保存されるたびにいくつかのサムネイルを作成したい場合は、次のようにすることができます。

from django.db import models

# This is to list all the countries
# For starters though, this will be just United Kingdom (GB)
class Country(models.Model):
    name = models.CharField(max_length=120, help_text="Full name of country")
    code = models.CharField(max_length=2, help_text="This is the ISO 3166 2-letter country code (see: http://www.theodora.com/country_digraphs.html)")
    flag = models.ImageField(upload_to="images/uploaded/country/", max_length=150, help_text="The flag image of the country.", blank=True)

    class Meta:
        verbose_name_plural = "Countries"

    def __unicode__(self):
        return self.name

    def save(self, force_insert=False, force_update=False):
        resize_image(self.flag)
        super(Country, self).save(force_insert, force_update)

必要な画像のサイズが 100% わからない場合は、直前にサイズを変更できます。私はこれが templatetag で効果的に行われるのを見てきました (私は Pinax のバージョンを信じています)。画像とサイズを取得する templatetag を作成し、必要に応じて適切なサイズの画像を作成して保存するか、以前に作成した画像がある場合は表示します。それはかなりうまくいきます。

于 2009-07-22T13:00:26.300 に答える
1

ライアンは正しい信号はより良い方法ですが、オーバーライドされた保存の利点は、古い画像パスと新しい画像パスを取得し、画像が変更されたかどうかを確認し (新しいサムネイルが作成されたかどうか)、モデル インスタンスを保存できることです。古い画像とサムネイルを削除します。

django は古いイメージをクリーンアップしないことに注意してください。そのため、イメージ/サムネイルがまだ使用されていることを確認し、使用されていないものをクリーンアップするスクリプトがない限り、ディスク スペースがリークします。(画像サイズと更新頻度によっては、これが問題になる場合とそうでない場合があります)

post_save シグナルでこれを行う方法がわかりません。適切な pre_save シグナルがあるかどうかを知るには、シグナルについて十分に知りません (これは今夜の調査です!)。見つけた場合は、上記のコードを書き直して、信号を一般的な事前保存リスナーとして使用します。

于 2009-07-22T15:01:54.353 に答える
0

Justin Driscoll のdjango-photologueもサイズ変更に最適です。これ:

  1. サイズ変更(つまり、高さまたは幅に比例してスケーリングできます)
  2. 作物(ちょっと賢い: 中央、上、左、下、または右から)
  3. オプションでサイズアップ
  4. 効果を追加できます(「色」、「明るさ」、「コントラスト」、「シャープネス」、および「エッジの検索」や「エンボス」などのフィルター。画像をシャープにします。サムネイルを白黒にします。)
  5. 簡単な透かしを追加できます
  6. 結果をキャッシュする

基本的にすごいです。

于 2009-08-26T15:51:36.813 に答える
-1

'Pillow' を使用してデータベース モデルにデータを保存した後、写真のサイズを変更できます。以下の手順:

1-最初に「Pillow」がインストールされていることを確認してください。

2-プロファイルモデルクラスの私のコードは次のとおりです:

from PIL import Image

class Profile(models.Model):

    PRF_image = models.ImageField(upload_to='profile_img', blank=True, null=True)



    def save(self , *args , **kwargs):
        # change profile image size
        img = Image.open(self.PRF_image.path)
        if img.width > 300 or img.height > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.PRF_image.path)

これは単なる例であり、ケース/要件に合わせて変更してください。

このメソッドを使用するには、ビュー内で your_object.save() を使用することを忘れないでください。

これが役立つことを願っています

于 2020-09-22T10:19:49.907 に答える