3

この方法を使用して、アップロードされたファイルのサイズを変更するためにPILを使用しています。

def resize_uploaded_image(buf):
  imagefile = StringIO.StringIO(buf.read())
  imageImage = Image.open(imagefile)

  (width, height) = imageImage.size
  (width, height) = scale_dimensions(width, height, longest_side=240)

  resizedImage = imageImage.resize((width, height))
return resizedImage

次に、このメソッドを使用して、メインビューメソッドでresizeedImageを取得します。

image = request.FILES['avatar']
resizedImage = resize_uploaded_image(image)
content = django.core.files.File(resizedImage)
acc = Account.objects.get(account=request.user)
acc.avatar.save(image.name, content)

ただし、これにより「読み取り」エラーが発生します。

痕跡:

例外タイプ:/ myapp / editAvatarのAttributeError例外値:読み取り

これを修正する方法はありますか?私は何時間もそこにいました!ありがとう!

Nikunj

4

2 に答える 2

4

ファイルのようなオブジェクトを取得し、PILで画像として操作してから、ファイルのようなオブジェクトに戻す方法は次のとおりです。

def resize_uploaded_image(buf):
    image = Image.open(buf)

    (width, height) = image.size
    (width, height) = scale_dimensions(width, height, longest_side=240)

    resizedImage = image.resize((width, height))

    # Turn back into file-like object
    resizedImageFile = StringIO.StringIO()
    resizedImage.save(resizedImageFile , 'PNG', optimize = True)
    resizedImageFile.seek(0)    # So that the next read starts at the beginning

    return resizedImageFile

thumbnail()PILイメージにはすでに便利な方法があることに注意してください。これは、私が自分のプロジェクトで使用しているサムネイルコードの変形です。

def resize_uploaded_image(buf):
    from cStringIO import StringIO
    import Image

    image = Image.open(buf)

    maxSize = (240, 240)
    resizedImage = image.thumbnail(maxSize, Image.ANTIALIAS)

    # Turn back into file-like object
    resizedImageFile = StringIO()
    resizedImage.save(resizedImageFile , 'PNG', optimize = True)
    resizedImageFile.seek(0)    # So that the next read starts at the beginning

    return resizedImageFile
于 2012-06-05T14:30:02.670 に答える
1

アップロードした画像を保存してから、必要に応じてテンプレートに表示してサイズを変更することをお勧めします。このようにして、実行時に画像のサイズを変更できます。sorl-thumbnailは、テンプレート画像のサイズ変更に使用できるdjanoアプリで、使いやすく、ビューでも使用できます。このアプリの例を次に示します。

于 2012-06-05T11:27:07.560 に答える