4

だから私はImageFieldに画像をアップロードするために使用されるDjangoのフォームを持っています。これはうまく機能します。次に、request.FILES ['image']をMakeThumbnailという関数に渡して、さらに処理します。

MakeThumbnailはあまりうまく機能していません。私はこれを一連のStackOverflowスレッドから組み立てましたが、いくつかの重要な概念が欠けていると思います。これが私のコードです。

    def MakeThumbnail(file):
        img = Image.open(file)
        thumbnail = img.thumbnail((128, 128), Image.ANTIALIAS)
        thumbnailString = StringIO.StringIO(thumbnail)
        newFile = ContentFile(thumbnailString)
        return newFile

スタックトレースは、この行で失敗していることを示しています:newFile = ContentFile(thumbnailString)。次のエラーが発生します:予期された読み取りバッファー、インスタンスが見つかりました

ローカル変数を確認した後、thumbnail = img.thumbnail((128、128)、Image.ANTIALIAS)でフェイルバックしている可能性があると思います。

thumbnailString : <StringIO.StringIO instance at 0x0000000003B39748>
file : <InMemoryUploadedFile: Desert.jpg (image/jpeg)>
thumbnail : None
img : <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=128x96 at 0x3B25C08>

サムネイルがなしであることに注意してください。何かが含まれている必要があります。誰かが私にいくつかのヒントを持っていますか?

ありがとう!

4

3 に答える 3

7

Jan Spurny、助けてくれてありがとう。私はあなたの助けを借りてそれを理解しました。したがって、imgがthumbnailStringに保存されると、いくつかのことが発生する必要があります。上記のコードでは、バッファではなくContentFileにインスタンスを渡すため、実際にはエラーが発生します。関係なく、thumbnailString.read()を呼び出す必要があります。ただし、thumbnailString.read()は''を返します。事前にt​​humbnailString.seek(0)を実行する必要があることがわかりました。しかし、これもうまくいきませんでした!

最終的に、InMemoryUploadedFileを使用して画像ファイルをDjangoファイルに戻すことができました。

コードは最初から最後まで次のようになります。

from django.core.files.uploadedfile import InMemoryUploadedFile
import StringIO
def MakeThumbnail(file):
    img = Image.open(file)
    img.thumbnail((128, 128), Image.ANTIALIAS)
    thumbnailString = StringIO.StringIO()
    img.save(thumbnailString, 'JPEG')
    newFile = InMemoryUploadedFile(thumbnailString, None, 'temp.jpg', 'image/jpeg', thumbnailString.len, None)
    return newFile
于 2012-09-06T23:47:46.517 に答える
3

についてのPILドキュメントからImage.thumbnail

指定されたサイズ以下のサムネイルバージョンを含むように画像を変更します。このメソッドは、画像のアスペクトを保持するために適切なサムネイルサイズを計算し、ドラフトメソッドを呼び出してファイルリーダーを構成し(該当する場合)、最後に画像のサイズを変更します。

これは、サムネイルが変数でimgはなく、にあることを意味します。これは、何も返さないためです(したがって、)thumbnailImage.thumbnailNone

もう1つのエラーはに置くPIL.ImageことStringIOです。あなたはsaveそれをStringIO

したがって、コードは次のようになります。

def MakeThumbnail(file):
    img = Image.open(file)
    img.thumbnail((128, 128), Image.ANTIALIAS)
    thumbnailString = StringIO.StringIO()
    img.save(thumbnailString, 'PNG')
    newFile = ContentFile(thumbnailString)
    return newFile
于 2012-09-06T09:48:59.057 に答える
0

パスのインスタンスではなく、画像のフルパスを関数に渡す必要があると思います。

EX:
models.py
logo = models.ImageField(upload_to=os.path.join(MEDIA_ROOT, "logo"), null=True, default=None)

U need to pass
def MakeThumbnail(logo.path):
于 2012-09-06T04:51:32.363 に答える