1

request.FILES['image'] から写真のサイズを 2 回変更しようとしている関数があります。パーサーでも image.thumbnail() を使用しています。これは、サムネイルを 1 つ作成すると問題なく動作しますが、私の見解では、まったく同じことをもう一度繰り返すと、IOError cannot parse image を介してパーサーで失敗します。私はとても混乱しています。Django の UploadedFile オブジェクトをそのまま使用する代わりに、メモリ内に StringIO ファイルを作成しましたが、それでも同じことを行います。どんな助けでも大歓迎です。

URL を 2 回取得することなく、次の操作を 2 回 (2 つの異なるサムネイル サイズで) 実行したいとします。

import urllib2
from PIL import Image, ImageFile, ImageEnhance

# create Image instance
file = urllib2.urlopen(r'http://animals.nationalgeographic.com/staticfiles/NGS/Shared/StaticFiles/animals/images/primary/kemps-ridley-sea-turtle.jpg')
parser = ImageFile.Parser()
while True:
    s = file.read(1024)
    if not s:
        break
    parser.feed(s)
image = parser.close()

# make thumbnail
size = (75, 75)
image.thumbnail(size, Image.ANTIALIAS)
background = Image.new('RGBA', size, (255, 255, 255, 0))
background.paste(
    image,
    ((size[0] - image.size[0]) / 2, (size[1] - image.size[1]) / 2))

background.save('copy.jpg')

例えば:

image = parser.close()
image2 = parser.close() # Obviously this doens't work
image2 = image # Obviously this doesn't either but you get what I need to do here
# Do 2 thumbnails with only one original source.

...その他のコードは省略...

image.save('copy.jpg')
image2.save('copy.jpg')
4

3 に答える 3

2

元の画像をコピーするよりも簡単な解決策は、次のように、thumbnail(...) の呼び出しの間にファイル ポインターをリセットすることです。

original.seek(0)
于 2009-11-23T06:11:41.237 に答える
2

あなたが言うように、これが一度機能する場合、取得した画像は問題ありません。単一の PIL 画像から複数のサムネイルを取得するには、少なくとも 2 つの異なる方法があります。

  1. resize元のサイズを変更したコピーを返すPIL のメソッドを使用できます。プロポーションをそのまま維持したい場合は、必要な寸法を計算するだけです。
  2. Image.copy() を使用して、画像のコピーを取得します。

このような:

original = parser.close()
...

thumb1 = original.copy()
size = (75,75)
thumb1.thumbnail(size, Image.ANTIALIAS)
...

thumb2 = original.copy()
thumbnail2 = original.resize(size2, Image.ANTIALIAS)
...

この方法では、オリジナルが変更されることはなく、必要な数のコピーを取得できます。

于 2009-09-28T07:57:57.330 に答える
0

image = parser.close(). の行で失敗していると思いIOErrorます。ImageFileそのため、画像データの取得方法に問題がある可能性があります。代わりにローカルファイルからの読み取りを試みましたか?

パーサーが画像をデコードできた場合は、Imageオブジェクトを返します。それ以外の場合、このメソッドはIOError例外を発生させます。

ソース

于 2009-09-28T07:54:06.373 に答える