1

Django と Python を使い始めたばかりで、写真アプリを作成しようとしています。このスクリプトはサムネイルを生成しています。私はそれを自分でやりたいと思っています。残念ながら、私は何をしているのか理解していませんStringIO()。その場合、Python Docs はあまり役に立ちません。

StringIO()誰かがこの特定のケースで何をするのか説明してもらえますか?

http://djangosnippets.org/snippets/1172/から:

def save(self):
    from PIL import Image
    #Original photo
    imgFile = Image.open(self.image.path)

    #Convert to RGB
    if imgFile.mode not in ('L', 'RGB'):
        imgFile = imgFile.convert('RGB')

    #Save a thumbnail for each of the given dimensions
    #The IMAGE_SIZES looks like:
    #IMAGE_SIZES = { 'image_web'      : (300, 348),
    #                'image_large'    : (600, 450),
    #                'image_thumb'    : (200, 200) }
    #each of which corresponds to an ImageField of the same name
    for field_name, size in self.IMAGE_SIZES.iteritems():
        field = getattr(self, field_name)
        working = imgFile.copy()
        working.thumbnail(size, Image.ANTIALIAS)
        fp = StringIO()
        working.save(fp, "JPEG", quality=95)
        cf = ContentFile(fp.getvalue())
        field.save(name=self.image.name, content=cf, save=False);

    #Save instance of Photo
    super(Photo, self).save()
4

2 に答える 2

2

StringIOは、ファイルのようなオブジェクトとして使用できるクラスです。通常のファイルとまったく同じように使用できますが、データがディスクに書き込まれる代わりに、メモリ内のバッファー (文字列バッファー) に書き込まれます。

このスクリプトでは、画像が最初に StringIO メモリ バッファに保存され、その後、文字列の値が取得されて ContentFile のコンストラクタに渡され、ContentFile の新しいインスタンスが作成され、フィールド save に渡されます。関数。

スクリプトが StringIO を使用している理由は、ContentFile のコンストラクターが文字列を受け取り、StringIO ファイルへの書き込みと読み取りが、文字列として表される画像コンテンツを取得する最も簡単な方法であるためだと思います。

補足として、 Django の ImageFileフィールド タイプを確認することをお勧めします。これは、私の画像関連のニーズには十分であり、StringIO と ContentFiles を使用するよりも明確です。

于 2011-12-13T22:06:23.547 に答える
0

StringIOは、ファイルに書き込むのと同じように、文字列の読み取りと書き込みを行う機能を提供します。これにより、コーディングがより便利、簡単、またはその両方になる可能性があります。

また、通常のPython文字列とは異なり、文字列を編集することもできます。

于 2011-12-13T21:57:17.070 に答える